PiDP-8/I Software

Changes On Branch pi4-gpio-clean
Log In

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

Deleted .agignore.
1
2


-
-
inst
test
Added .fossil-settings/clean-glob.




























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
Changes to .fossil-settings/crlf-glob.
1
2








3
4
5
6
7
8
9



10
11
12
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/*.sb
src/cc8/os8/bldcc8.bi
src/cc8/os8/*.[ch]
src/cc8/os8/*.bi
src/cc8/os8/*.sb

src/PDP8/pdp8_*.[ch]
src/PDP8/pidp8i.c.in
Changes to .fossil-settings/ignore-glob.

1
2
1
2
3
+


autosetup/Makefile
doc/simh/*.pdf
test/*
Added .github/workflows/ci.yml.

































1
2
3
4
5
6
7
8
9
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
Changes to .ignore.
1



1
2
-
+
+
.agignore
inst
test
Changes to AUTHORS.md.
75
76
77
78
79
80
81




82
83
84
85
86
87
88
89
90
91
92
93
94

95
96
97
98
75
76
77
78
79
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
Added CONTRIBUTING.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
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
Changes to COPYING.md.
1
2
3
4
5
6
7
8
9
10
11
12
13
14


15
16
17
18
19
20
21
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.
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
86

87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

105
106
107
108
109
110
111

112
113
114
115
116
117
118
119
120
121
80
81
82
83
84
85
86

87
88
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/LICENSE.txt
[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 [public domain license][pdp8pd] DEC released all their PDP-8
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
[pdp8pd]: http://mailman.trailing-edge.com/pipermail/simh/2017-January/016164.html
[decpd]: http://mailman.trailing-edge.com/pipermail/simh/2017-January/016164.html


## <a id="etos"></a>ETOS License

ETOS was a commercial product produced outside of DEC. No public
documented declaration of license is known to be available for it, but
we have [a third-hand report][el] that its creators are fine with ETOS
being redistributed.

[el]: http://mailman.trailing-edge.com/pipermail/simh/2017-January/016169.html
Changes to ChangeLog.md.
1
2



















































































































































































































































3
4

5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
## 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
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
308
309
310



311
312
313
314
315
316
317

318
319
320
321
322
323
324
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/trunk/doc/cc8-manual.md
[esco]: https://tangentsoft.com/pidp8i/doc/trunk/README.md#savestate
[pv]:   https://tangentsoft.com/pidp8i/doc/trunk/README.md#systemd
[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
## 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
693
694


695
696
697
698
699
700
701
702


703
704
705
706
707
708


709
710
711
712
713
714
715
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/trunk/doc/cc8-manual.md
[csd]:   https://tangentsoft.com/pidp8i/doc/trunk/doc/class-simh.md
[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/trunk/doc/os8-patching.md
[os8rm]: https://tangentsoft.com/pidp8i/doc/trunk/media/os8/README.md
[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/trunk/doc/uwfocal-manual.md
[uwfs]:  https://tangentsoft.com/pidp8i/doc/trunk/doc/uwfocal-manual-supp.md
[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
736

737
738
739
740
741
742
743
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
## 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
1218
1219


1220
1221
1222
1223
1224
1225
1226
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/trunk/COPYING.md
[rmth]:    https://tangentsoft.com/pidp8i/doc/trunk/README-throttle.md
[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
1251

1252
1253
1254
1255
1256
1257
1258
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
## 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
1531

1532
1533
1534
1535

1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
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/trunk/README.md
[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/trunk/examples/README.md
[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.
Deleted HACKERS.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
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































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Hacking on the PiDP-8/I Software
====

If you are going to make any changes to the PiDP-8/I software, here are
some rules and hints to keep in mind while you work.


<a id="gs-fossil"></a>
Getting Started with Fossil
----

The PiDP-8/I software project is hosted using the [Fossil][fossil]
[distributed version control system][dvcs].  Fossil provides most of the
features of GitHub under a simpler operating model than Subversion
without tying you to a proprietary web service.

This guide will introduce you to some of the basics, but you should also
at least read the [Fossil Quick Start Guide][fqsg]. For a more thorough
introduction, I recommend [the Schimpf book][fbook]. If you have
questions about Fossil, you can ask on [the Fossil forum][ffor], where
I, your humble project maintainer, am active.

If you started with one of our PiDP-8/I binary OS images made in or
after April 2017, Fossil 2.x is already installed.

If you're starting from some other OS, you either won't have Fossil
installed at all, or you'll most likely be using an older version, since
the Debian project is still shipping version 1.37 and likely will
continue to do so until 2020 or so in accordance with their software
stability policy.  You could build Fossil from source, or you could just
go grab a pre-built binary we keep on the project site:

    $ wget https://tangentsoft.com/pidp8i/uv/fossil-2.8-raspbian-9.6-stretch
    $ sudo install -m 755 fossil-* /usr/local/bin/fossil

Fossil is also available for all common desktop platforms.  One of [the
official binaries][fbin] may work on your system.  If you're getting
binaries from a third party, be sure it is Fossil 2.1 or higher.


[fbin]:   https://fossil-scm.org/index.html/uv/download.html
[dvcs]:   https://en.wikipedia.org/wiki/Distributed_revision_control
[fbook]:  https://www.fossil-scm.org/schimpf-book/home
[ffor]:   https://fossil-scm.org/forum/
[fossil]: https://fossil-scm.org/
[fqsg]:   https://fossil-scm.org/index.html/doc/trunk/www/quickstart.wiki


<a id="fossil-anon"></a>
Fossil Anonymous Access
----

To clone the code repository anonymously, say:

    $ mkdir -p ~/museum ~/src/pidp8i/trunk
    $ fossil clone https://tangentsoft.com/pidp8i ~/museum/pidp8i.fossil
    $ cd ~/src/pidp8i/trunk
    $ fossil open ~/museum/pidp8i.fossil

The `clone` command 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 can call that clone file anything you
like and put it in any directory you like.  Even the `.fossil` extension
is largely a convention, not a requirement.


<a id="tags" name="branches"></a>
Working with Existing Tags and Branches
----

The directory structure shown in the commands above is more complicated
than strictly necessary, but it has a number of nice properties.

First, it collects other software projects under a common top-level
directory, which I'm calling `~/src`, but you are free to use any scheme
you like.

Second, the top-level project directory stores multiple separate
checkouts, one for each branch or tag I'm 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
      ...etc...
    $ cd release
    $ fossil open ~/museum/pidp8i.fossil release
    $ cd ../v20151215
    $ fossil open ~/museum/pidp8i.fossil v20151215
      ...etc...

This gives you multiple independent checkouts.  The branch checkouts
remain pinned to the tip of that branch, so that if someone else checks
changes in on that branch and you say `fossil update`, those changes
appear in your checkout of that branch.  The tag checkouts simply give
you the latest checkin with that tag; saying `fossil update` in a
checkout made from a tag will fast-forward you to the tip of the branch
that tag was made on.

(In Fossil, tags and branches are related, but the details are beyond
our scope here.  See the [Fossil Quick Start Guide][fqsg] and the
documents it links to for more details.)

This directory scheme shows an important difference between Fossil and
Git: with Git, the checkout and the clone are normally intermingled in
the same directory tree, but in Fossil, the clone and the checkout are
always strictly separate.  Git has a weak emulation of Fossil's normal
working style via its [worktree][gitwt] feature, but most Git users
aren't even aware of the feature, and those that are aware of it tend to
discourage its use because of the problems it can cause.  Fossil was
designed to work this way from the start, so it doesn't have the
problems associated with Git worktrees.

Another important difference relative to Git is that with Fossil, local
checkins attempt to automatically sync checked-in changes back to the
repository you cloned from.  (This only works if you have a login on the
remote repository, the subject of the [next section](#login).)  This
solves a number of problems with Git, all stemming from the fact that
Git almost actively tries to make sure every clone differs from every
other in some important way.

While Fossil does allow offline operation and local independent clones,
its default mode of operation is to try and keep the clones in sync as
much as possible.  Git works the way it does because it was designed to
meet the needs of the Linux kernel development project, which is
inherently federated, so Git tries to operate in a federated model as
well.  Fossil is better for smaller, more coherent teams, where there is
a single, clear goal for the project and a single source for its
official code.  Fossil helps remote developers cooperate, whereas Git
helps remote developers go off on their own tangents for extended
periods of time and optionally sync back up with each other
occasionally.

Fossil is a better match for the way the PiDP-8/I software project
works: we want you to cooperate closely with us, not go off on wild
tangents.

[gitwt]:  https://git-scm.com/docs/git-worktree


<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, you don't have to clone again to
inform Fossil about your developer account.  Just do a manual sync from
within a PiDP-8/I checkout directory, changing the URL to include the
user name:

    $ 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 are 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="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 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.

We used to relegate such discussions to private email, but that was not
out of any wish to hide what we're doing. We just didn't have a good
place to do this work in public until recently.

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="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, and 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, and maybe lend advice or a hand in the work; mostly,
public branches let your collaborators see what you're up to, so they're
not surprised when the change finally lands in trunk.

This is part of what I mean about Fossil fostering close cooperation
rather than fostering wild tangents.

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.

[brlist]: https://tangentsoft.com/pidp8i/brlist
[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/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="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


<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 Tcl and C code under the `autosetup` directory.

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.

The bulk of the customization to the build system is in `auto.def`,
which is a Tcl script run by `autosetup` via the `configure` script.
Some knowledge of [Tcl syntax][tcldoc] will therefore be helpful in
modifying it.

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 more or less a strict subset of Tcl, 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`.

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 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 straightforward, but the
PiDP-8/I software is built primarily on and for a single operating
system, Raspbian Linux.  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 set` command.

    Say `fossil help set` at the command line 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.

    The content of this directory is copied to `$prefix/bin` at
    installation time, which is added to the user's `PATH` by the
    `make install` script.

*   <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 sufficiently unimportant to a new
    user of the software that they need not be at the top level of the
    project tree.  Such files can wait for new users to discover them.

    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.  Why are there two different ways to achieve the
    same end, and how do we decide which mechanism to use?

    The rule is simple: if a given document's change history is tied to
    the history of the PiDP-8/I project itself, it goes in `doc`, else
    it goes in the wiki.  When checking out older versions of the
    PiDP-8/I software, you expect to roll back to contemporaneous
    versions of the project documentation, which is what happens to all
    files stored in the repository, including those in `doc`, but this
    does not happen to the wiki documents.  The wiki always presents the
    most current version, no matter what version you have locally
    checked out.

    (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 manually go poking around in the history to pull
    up old versions.  If you check out a historical version of the
    software and then say `fossil ui` within that checkout directory,
    the resulting web view still shows the most recent locally-available
    version of each wiki document, not versions of the wiki documents
    contemporaneous with the historical version of the Fossil tree you
    have checked out.)

    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.  Example:

    *   <b>`scanswitch`</b> - Run by `etc/pidp8i`.
    
        <p>It is run by hand only by developers modifying its behavior.</p>

    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
    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>`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`.

    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://www.fossil-scm.org/index.html/doc/trunk/www/embeddeddoc.wiki
[uflp]: https://www.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 PiDP-8/I software
repository, you can still send changes to the project.

The simplest way is to say this after developing your change against the
trunk of PiDP-8/I:

    $ fossil diff > my-changes.patch

Then either upload that file somewhere (e.g. Pastebin) and point to it
from a [forum post][pfor] or attach the patch to a new [PiDP-8/I mailing
list][ggml] message. Either way, 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 hard-linked into any other part of the PiDP-8/I software system.

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:

    $ 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
PiDP-8/I 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, send it to the developers the same
way you should a patch file.

If you provide a quality patch, we are likely to offer you a developer
login on [the repository][repo] so you don't have to continue with the
patch or bundle methods.

Please make your patches or experimental branch bundles against the tip
of the current trunk.  PiDP-8/I often drifts enough during development
that a patch against a stable release may not apply to the trunk cleanly
otherwise.

[osil]:  https://opensource.org/licenses
[repo]:  https://tangentsoft.com/pidp8i/
[simhl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md
[viral]: https://en.wikipedia.org/wiki/Viral_license


<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

*   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:

        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:

        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 Processes
----
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.

Therefore, the first thing that should happen to a ticket is that
someone with sufficient privilege should triage it and fix up any
incorrect settings.

The Status of a ticket initially starts out as Open. If the person
triaging a ticket takes the time to check that the problem actually
occurs as the ticket filer claims or that the requested feature is in
fact missing, the Status should change to Verified.

If a developer implements a fix or feature 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.

Larger teams often require 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.


## License

Copyright © 2016-2019 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
Changes to Makefile.in.
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
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-2019 by Warren Young
# 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
39
40


41
42
43

44
45
46

47

48
49
50







51
52
53
54
55
56
57
32
33
34
35
36
37
38


39
40
41
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=4e0450cff96830c5aced36928a4427adfc5314f8
SGCTM=2019-04-18T20:03:17-07:00
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@ @BUILDMODE@ \
SIM_CFLAGS := @CFLAGS@ @PI_CFLAGS@ @BUILDMODE@ \
	-Wno-unused-result -Wno-parentheses \
	-DUSE_READER_THREAD -DHAVE_DLOPEN=$(subst .,,@SH_SOEXT@) -DPIDP8I \
	-DSIM_ASYNCH_IO -DHAVE_REGEX_H -DHAVE_GLOB \
	-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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
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

CC_OS8_OBJS := \
	obj/cc8/os8/libc.sb \
	obj/cc8/os8/c8.sb \
	obj/cc8/os8/n8.sb \
	obj/cc8/os8/p8.sb

CC_OS8_SRCS := \
	@srcdir@/src/cc8/os8/header.sb

CC_OS8_DEMOS := \
	obj/cc8/os8/fib.c \
	obj/cc8/os8/calc.c \
	obj/cc8/os8/ps.c \


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
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
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_DIST_RK05 = bin/v3d-dist.rk05
OS8_SRC_RK05 = @OS8_SRC_RK05@
OS8_BOOT_DISK = bin/@OS8_BOOT_DISK@
OS8_RK05S = $(OS8_DIST_RK05) $(OS8_BOOT_DISK) $(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@/media/os8/scripts
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_RK05_SCRIPT = $(OS8_SCRIPTS_DIR)/v3d-rk05.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
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 = $(OS8_SCRIPTS_DIR)/cusp-copyin.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

CC8_TU56_SCRIPT = $(OS8_SCRIPTS_DIR)/cc8-tu56.os8

# 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) \
		$(OS8_RK05S) $(V3F_MADE_RK05) $(V3F_BUILD_RK05) $(V3D_TC08_TU56) \
		$(V3D_TD12K_TU56) $(V3F_TC08_TU56) $(V3F_TD12K_TU56) \
		config.log cscope.out tags \
		bin/*.pt  bin/*.save bin/txt2ptp \
		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 \
		src/config.h \
		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: all instdirs
	@echo Installing to @prefix@...
install-target: all instdirs
	@echo Installing to $(PREFIX)...

	@# Install most bin/* stuff and set their perms
	@for f in $(BINS) ; do \
		dest=@prefix@/$$f ; \
		dest=$(PREFIX)/$$f ; \
		echo "Installing binary $$dest..." ; \
		@INSTALL@ -m 755 -D -s $$f $$dest ; \
		@INSTALL@ -m 755 -D -s $$f $(DESTDIR)$$dest ; \
	done
	@for f in $(BIN_SCRIPTS) ; do \
		dest=@prefix@/bin/$$(basename $$f) ; \
		dest=$(PREFIX)/bin/$$(basename $$f) ; \
		echo "Installing script $$dest..." ; \
		@INSTALL@ -m 755 -D $$f $$dest ; \
		@INSTALL@ -m 755 -D $$f $(DESTDIR)$$dest ; \
	done
	@( cd @prefix@/bin ; \
	   echo "Installing txt2ptp symlink..." ; \
	   ln -f ptp2txt txt2ptp ; \
	@echo "Installing txt2ptp symlink..."
	@ln -f $(DESTDIR)$(PREFIX)/bin/ptp2txt $(DESTDIR)$(PREFIX)/bin/txt2ptp
	)
	@(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' $$f ; \
		done \
	) || true
	@(	test -e @MEDIADIR@/os8/os8.rk05 || \
		test -e @MEDIADIR@/os8/os8v3d-bin.rk05 || \
		test -e @MEDIADIR@/os8/v3d.rk05) && \
	@(	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
	@ln -f @prefix@/bin/pidp8i-sim @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 && \
		/sbin/udevadm control --reload-rules && \
		/sbin/udevadm trigger \
		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@ @ABSPREFIX@/bin/pidp8i install && \
		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 "@ABSPREFIX@/bin" "/home/$$SUDO_USER/$$p" && \
			echo "export PATH=\$$PATH:@ABSPREFIX@/bin" >> "/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 "@ABSPREFIX@/share/man" "/home/$$SUDO_USER/$$p" && \
			echo "export MANPATH=\$$MANPATH:@ABSPREFIX@/share/man" >> "/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

	@# Install CC8 stuff if built
	@test -n "@CC8_CROSS@" && \
		echo "Installing cc8 cross-compiler..." ; \
		@INSTALL@ -m 755 bin/cc8 @prefix@/bin && \
		@INSTALL@ -m 644 @srcdir@/src/cc8/include/* @prefix@/share/include

	@# Install palbart stuff
	@@INSTALL@ -m 755 bin/palbart @prefix@/bin
	@@INSTALL@ -m 644 @srcdir@/src/palbart/palbart.1 @prefix@/share/man/man1

	@# Install os8-run and its dependencies
	@echo "Installing os8-run..."
	@@INSTALL@ -m 775 -g @INSTGRP@ $(OS8RUN) @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}  $${dest}  ; \
	    @INSTALL@ -m 644 -g @INSTGRP@ -D $${src}c $${dest}c ; \
	  done \
	)
	@sed -e 's#^build =.*#build = "@ABSPREFIX@"#' \
	     -e 's#^media =.*#media = os.path.join (build, "share/media/")#' \
	     -e 's#^os8mo =.*#os8mo = os8mi#' \
		 < $(PIDP8I_DIRS) > @prefix@/$(PIDP8I_DIRS)
	@chgrp @INSTGRP@ @prefix@/$(PIDP8I_DIRS)

instdirs:
	@echo "Creating installation directory tree..."
	@for d in $(INSTDIRS) ; do @INSTALL@ -m 755 -o @INSTUSR@ -g @INSTGRP@ -d @prefix@/$$d ; done
	@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 \*.os8 -o \
		-name \*.bin  -o \
		-name \*.dsk  -o \
		-name \*.rk05 -o \
		-name \*.tu56 \
	\) -exec @INSTALL@ -D -m 664 -o @INSTUSR@ -g @INSTGRP@ {} @ABSPREFIX@/share/{} \;
	@@INSTALL@ -m 644 -o @INSTUSR@ -g @INSTGRP@ bin/*.rk05 @ABSPREFIX@/share/media/os8
	@@INSTALL@ -m 644 -o @INSTUSR@ -g @INSTGRP@ bin/*.tu56 @ABSPREFIX@/share/media/os8
	\) -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 > @SHAREDIR@/$$f ; \
		chown @INSTUSR@:@INSTGRP@ @SHAREDIR@/$$f ; \
		chmod 664 @SHAREDIR@/$$f ; \
		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) $(CC8_TU56_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
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
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
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@/media/os8/patches/*.patch8
	@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_DIST_RK05): $(V3D_DIST_SRCS) | $(PIDP8I_SIM) $(OS8RUN_OUTFILES)
$(OS8_BASELINE): $(V3D_DIST_SRCS) | $(PIDP8I_SIM) $(OS8RUN_OUTFILES)
	$(OS8RUN)@OS8_OPTS@ $(V3D_DIST_SCRIPT)

$(OS8_BOOT_DISK): $(V3D_RK05_SCRIPT) $(OS8_DIST_RK05) $(V3D_PATCHES) @CC8_TU56@ | $(PIDP8I_SIM) $(OS8RUN_OUTFILES)
	$(OS8RUN)@OS8_OPTS@ $(V3D_RK05_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_DIST_RK05) $(OS8_SRC_SRCS) | $(PIDP8I_SIM) $(OS8_BOOT_DISK)
$(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_BOOT_DISK)
	cd $(V3F_SRCDIR); @builddir@/bin/os8-cp -v --action-file $(V3F_MANIFEST)
$(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_BOOT_DISK) 
$(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_BOOT_DISK) 
$(V3D_TD12K_TU56): $(ALL_TU56_SCRIPT) $(CUSP_COPYIN_SCRIPT) | $(OS8_TOOLTIME) 
	$(OS8RUN)@OS8_OPTS@ $(ALL_TU56_SCRIPT) --enable td12k

# Create the CC8 distribution DECtape image
bin/cc8.tu56: $(CC_OS8_OBJS) $(CC_OS8_SRCS) $(CC_OS8_DEMOS) $(CC8_TU56_SCRIPT) | $(OS8_DIST_RK05)
	$(OS8RUN) $(CC8_TU56_SCRIPT)

# 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
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
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 $@ $^ $(LIBS)
	$(CC) -o $@ @PI_LFLAGS@ $^ $(LIBS) $(SIM_LFLAGS) @PI_LIBS@
	ln -f bin/pidp8i-sim bin/pdp8

bin/cc8: $(CC8_OBJS)
	$(CC) -o $@ $^ $(LIBS)
	$(CC) $(CC8_CROSS_CFLAGS) -o $@ $^ $(LIBS)

bin/d8tape: $(D8TAPE_OBJS)
	$(CC) -o $@ $^
	$(CC) $(D8TAPE_CFLAGS) -o $@ $^

bin/palbart: $(PALBART_OBJS)
	$(CC) -o $@ $^
	$(CC) $(PALBART_CFLAGS) -o $@ $^

bin/pidp8i-test: obj/misc/test.o obj/pidp8i/gpio-nls.o obj/pidp8i/gpio-common.o
	$(CC) -o $@ $^ $(LIBS) -lncurses
	$(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 $@ $^ $(LIBS)
	$(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 $@ $^ $(LIBS)
	$(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

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)

Changes to README.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
1
2
3
4

5
6

7


8


9
10

11


12
13
14
15
16
17
18
19
20
21
22
23
24
25

26


27

28
29
30
31


32
33
34
35
36


37




38
39
40
41
42

43
44
45

46
47
48



49
50
51
52
53
54
55
56
57
58
59
60

61
62
63
64
65
66
67


68
69
70


71
72

73
74
75
76
77
78
79
80
81



82
83
84
85
86
87
88
89

90
91
92
93


94
95


96
97
98
99
100
101
102


103
104
105
106
107
108
109
110



111
112
113
114
115
116

117
118
119
120
121
122
123
124
125
126

127
128
129



130


131
132


133

134
135


136
137

138

139


140

141












142
















143
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 file from one of several likely places:
You will be reading this either:

*   [Online][tlrm], within [the Fossil project repository][home].
*   …[online][tlrm], within [the Fossil project repository][home]; or

*   As a text file within the [source packages][src].
*   …as a text file within the [source packages][src]; or

*   In the read-only [GitHub mirror][ghm].
*   …in the read-only [GitHub mirror][ghm].

The source packages and the GitHub mirror are secondary outputs from the
The latter two are secondary outputs from the first, being the PiDP-8/I
Fossil repository, which is the primary home for the PiDP-8/I software
development project.
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.  That rules out the
*   A Raspberry Pi with the 40-pin GPIO connector.
    first-generation Raspberry Pi model A and B boards which had a
    26-pin GPIO connector.

*   An SD card containing [a compatible OS][os].
*   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.  We recommend that you unpack it
    somewhere your user has read/write access like `$HOME/src/pidp8i`.
    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.

*   We require several tools and libraries that aren't always installed:

*   While those with no Linux and Raspberry Pi knowledge may be able to
    *   A working C compiler and other standard Linux build tools,
        such as `make(1)`.

    *   Python's `pexpect` library
    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.

    *   The `ncurses` development libraries
*   Building the software requires several tools and libraries, some of
    which you may not already have.

    To install all of this on a Raspbian type OS, say:
    On Raspberry Pi OS, say:

        $ sudo apt update
        $ sudo apt install build-essential
        $ sudo apt install libncurses-dev python-pip
        $ sudo pip install pexpect
        $ 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
[os]: https://tangentsoft.com/pidp8i/wiki?name=OS+Compatibility
[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/


<a id="unpacking"></a>
## Getting the Software onto Your Pi
## Enabling the SSH Server <a id="sshd"></a>

[That topic is covered elsewhere](./doc/OS-images.md#sshd).
If you're reading this file within an unpacked distribution of the
PiDP-8/I software, you may skip this section, because you have


already achieved its aim.
## 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.
If you are reading this [online][this] and have not yet downloaded and
unpacked the software source code onto your Pi, this section will get
you going.

[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
[this]: https://tangentsoft.com/pidp8i/doc/trunk/README.md
`README.md` file within an unpacked distribution of the PiDP-8/I
software, [skip to the next section](#configuring).


<a id="transferring"></a>
### Transferring the File to the Pi
### Transferring the Source Tarball to the Pi <a id="transferring"></a>

The first step is to get the tarball (`*.tar.gz` file) or Zip file onto
the Pi. There are many options:
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 file over.  When you boot the Pi up with that SD card,
    you will find the tarball or Zip file in `/boot`.
    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 *release* version.  (Use the
    "bleeding edge" links on the home page if you want the tip of trunk
    instead!)
    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, you can use
    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
    [`HACKERS.md` file][hack]. (Best for experts or those who wish to
    [`CONTRIBUTING.md` file][ctrb]. (Best for experts or those who wish to
    become experts.)

[hack]: https://tangentsoft.com/pidp8i/doc/trunk/HACKERS.md

5.  **Switch to the binary OS installation images** available from the
Alternatively, switch to [the binary OS installation images][bosi],
    [top-level project page][cprj].  These are default installations of
    Raspbian Lite with the PiDP-8/I software already downloaded, built,
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
    and installed.  These images were produced in part using option #4
    above, so you can use Fossil to update your software to the current
for you.
    version at any time, as long as the Pi is connected to the Internet.


<a id="unpacking"></a>
### Unpacking the Software on Your Pi
### Unpacking the Software on Your Pi <a id="unpacking"></a>

Having transferred the distribution file onto your Pi, you can unpack it
Having transferred the distribution file onto your Pi, unpack it with:
with one of the two following commands.

If you grabbed the tarball:

    $ tar xf pidp8i.tar.gz
    $ tar xvf /path/to/pidp8i-VERSION.tar.gz

If you grabbed the Zip file instead:

    $ unzip /path/to/pidp8i-VERSION.zip

The file name will vary somewhat, depending on when and how you
transferred the file.  After unpacking it, you will have a new
directory beginning with `pidp8i`.  `cd` into that directory, then
proceed with the [configuration](#configuring) steps below.


<a id="help"></a>
### If You Need More Help

If the above material is not sufficient to get you started, you might
want to look at [the documentation][rpfd] provided by the Raspberry
Pi Foundation.  In particular, we recommend their [Linux][rpfl] and
[Raspbian][rpfr] guides.  The book "[Make: Linux for Makers][lfm]"
by Aaron Newcomb is also supposed to be good.


[rpfd]: https://www.raspberrypi.org/documentation/
[rpfl]: https://www.raspberrypi.org/documentation/linux/
[rpfr]: https://www.raspberrypi.org/documentation/raspbian

[lfm]:  https://www.makershed.com/products/make-linux-for-makers


<a id="configuring"></a>
## Configuring, Building and Installing
## Configuring, Building and Installing <a id="configuring"></a>

This software distribution builds and installs in the same way as most
For a stock build, say:
other Linux/Unix software these days.  The short-and-sweet is:

    $ cd ~/pidp8i
    $ ./configure && make && sudo make install
    $ ./configure && tools/mmake && sudo make install

The `configure` step is generally needed only the first time you build
the software in a new directory.  You may want to add options after it,
as described [below](#options).
You may want to add options to the `configure` step, described
[below](#options).

After that initial configuration, the software normally auto-reconfigures
Subsequent software updates and rebuilds should not require that you
itself on updates using the same options you gave before, but occasionally
we make some change that prevents this from happening.  If you get a
re-run the `configure` step manually, but if automatic re-configuration
fails, you can force it:
build error after updating to a new version of the software, try saying:

    $ 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.
...and then continuing with the `make && sudo make install` steps before
reporting a build error.

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`.

If `make reconfig` also fails, you can try running the `configure`
script again manually.

## 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:
<a id="running"></a>
### Running the Software

        $ 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:
For the most part, this is covered in the documentation linked from the
[Learning More](/#learning) section of the project home page.

        $ 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 only tricky bit is that if this is the first time you have
configured, built and installed the software as above on a given system,
you will have to log out and back in before commands like `pidp8i` will
be in your user's `PATH`.


## 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:
<a id="options"></a>
### Configure Script Options

    $ 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:


<a id="prefix"></a>
### --prefix <a id="prefix"></a>
#### --prefix

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.


<a id="lowercase"></a>
### --lowercase <a id="lowercase"></a>
#### --lowercase

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
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
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 a Teletype Model 33 ASR.
    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.

    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.
    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.

*   **none** — This passes 7-bit ASCII text through to the software
    running on 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.

[sa]:  http://homepage.cs.uiowa.edu/~jones/pdp8/faqs/#charsets
[tty]: https://tangentsoft.com/pidp8i/wiki?name=OS/8+Console+TTY+Setup


<a id="nls"></a>
#### --no-lamp-simulator
### --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
currently takes too much CPU power to run on anything but a multi-core
Raspberry Pi, currently limited to the Pi 2 and Pi 3 series.
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].


<a id="serial-mod"></a>
### --serial-mod <a id="serial-mod"></a>
#### --serial-mod

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.


<a id="alt-serial-mod"></a>
### --alt-serial-mod <a id="alt-serial-mod"></a>
#### --alt-serial-mod

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
### --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, more
you don't give this option, the simulator runs as fast as possible.
or less.


<a id="savestate"></a>
### --enable-savestate <a id="savestate"></a>
#### --enable-savestate

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
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
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
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
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
### --disable-usb-automount <a id="dub"></a>

When you install the software on a [systemd][systemd]-based Linux
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
### --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>
<a id="disable-os8"></a>
#### --disable-os8-\*

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-ba** - Leave out the BASIC games and demos which
    come from DEC's book "101 BASIC Computer Games." These are normally
*   **--disable-os8-basic-games** - Leave out the BASIC games and demos which
    primarily come from DEC's book "101 BASIC Computer Games."
    installed to `RKB0:` as `*.BA`, thus the option's name.

    (We considered naming it `--disable-os8-basic-games-and-demos`, but
    that's too long, and it can't be `--disable-os8-basic` because that
    implies that it is the OS/8 BASIC subsystem that is being left out,
    which is not even currently an option.)

*   **--disable-os8-cc8** - Leave out Ian Schofield's native OS/8 CC8
    compiler and all of its ancillary files.

*   **--disable-os8-chess** — Leave out John Comeau's
*   **--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-k12** - Leave out the Kermit-12 implementation
*   **--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/
[os8p]:   https://tangentsoft.com/pidp8i/doc/trunk/doc/os8-patching.md
[os8pat]: https://tangentsoft.com/pidp8i/doc/trunk/doc/os8-patching.md
[os8pkg]: https://tangentsoft.com/pidp8i/doc/trunk/doc/os8pkg.md


<a id="enable-os8"></a>
### --enable-os8-\* <a id="enable-os8"></a>
#### --enable-os8-\*

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
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
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.

[uvte]: https://tangentsoft.com/pidp8i/wiki?name=Using+VTEDIT

*   **--enable-os8-focal69** — Because the default installation includes
    U/W FOCAL, we have chosen to leave FOCAL 69 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.
    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 69 we are currently shipping is fairly minimal: we
    believe we are shipping the original DEC version of FOCAL 69 plus a
    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 69, but we have not had
    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 69 that it will become more powerful than U/W
    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
### --os8-minimal <a id="os8-minimal"></a>

If you set this flag, it sets all `--enable-os8-*` flags to false and
all `--disable-os8-*` flags to true.  If you give this along with any
`--enable-os8-*` option, minimal mode overrides it.  Alas, the only way
to get "minimal plus one or two features" is to explicitly disable all
of the optional OS/8 features you don't want.
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:

This flag's name is aspirational, rather than accurate: our current
"minimal" installation could still be stripped down some more.  We
1.  This flag's name is aspirational, not a promise of an ideal: our
    current "minimal" installation could be stripped down further. For
expect to add more `--disable-os8-*` flags later to reduce the delta
between the ideal "minimal OS/8" and our current offering.  These
options would then be included in `--os8-minimal`.  An example of this
is OS/8's BASIC interpreter, which currently cannot be left out.

    example, we currently have no way to leave out OS/8's BASIC
    interpreter, even though no core OS services depend on it.
This option does not control some things you might think it should:

1.  This option does not affect the `--lowercase` option because that
    affects only OS/8's command interpreter and OS/8's BASIC
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.  If you want a *truly* pristime OS/8 disk, you should
    therefore also give `--lowercase=none`.
    features. You may therefore wish to give `--lowercase=none` along
    with `--os8-minimal`.

2.  This option does not affect `--disable-os8-src`, because it only
    suppresses optional features in the "bin" media.  If you want a
    minimal OS/8 bin disk and no src disk, give that option as well.
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.

3.  Although it disables *display* of the `INIT.TX` file on boot, the
    file is still generated in case you later want to enable it, since
    the file acts as build documentation as well as a "welcome" message.
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
### --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/)


## <a id="os8di"></a>The OS/8 RK05 Disk Image
## 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 on the disk worked properly with the other parts.
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.

In late 2017 [several of us][aut] created the `mkos8` tool, which was
replaced during 2018 by Bill Cattey with the `os8-run` interpreter
and its stock scripts. The `--*-os8-*` options documented above get
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).
passed into `os8-run` during the PiDP-8/I software build process,
which controls how it generates the `v3d*.rk05` RK05 disk image files.

This set of disk images entirely replaces the old `os8.rk05` disk image,
in that all features of the old disk image are still available. In some
cases, features present on the old `os8.rk05` disk are now left out or
disabled by default, and in other cases we have changed the behavior of
features from the way they used to be on the old disk. Mostly, though,
the new disk images are simply more functional than the old ones.
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 disk images are
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 disk
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
[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 disk images comes from a set of
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 `v3d-dist.rk05` disk image.
`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.
support, FORTRAN IV, MACREL v2, and more, but you can switch to an
[OCK build at compile time](#ock) if you prefer.


### Subtractions

It turns out that it's pretty easy to run out of directory space on an
OS/8 RK05 disk due to a limitation in the number of files on an OS/8
filesystem.  For this reason, the archive of device drivers and TD8E
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
system are left off the system packs.  They can be found in [OS/8
Binary Distribution DECtape #2][bdt2].
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.

If you do fancy work with `BUILD`, you may need to attach that DECtape
image and copy files in from it.
[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
701

702
703
704
705
706
707
708
709
710
711

712
713
714
715
716
717
718
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][os8p]
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


## <a id="os8ti"></a>The OS/8 TU56 Tape Image
## 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
736
737

738
739
740
741
742
743
744
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



<a id="overwrite-setup"></a>
## Overwriting the Local Simulator Setup
## 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
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












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`.
    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!


<a id="testing"></a>
## Testing Your PiDP-8/I Hardware
## 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][test] for more details.
See [its documentation][pitest] for more details.


<a id="using"></a>
## Using the Software

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, for the most part.

The largest user-visible difference between the two software
distributions is that many of the shell commands are different:

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 the terminal you're working on to the simulator:

        $ pidp8i

    (Yes, it's the same base command as above.  The `pidp8i` script uses
    its first argument to determine what you want it to do.  Without
    arguments, this is what it does.)

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 Raspbian command line:

        $ pidp8i stop

There are [other major differences][mdif] between the old stable
distribution and this one.  See that linked wiki article for details.


<a id="sshd"></a>
## Enabling the SSH Server on the Binary OS Images

The OpenSSH server is enabled and running by default on the PiDP-8/I
binary OS images, but for security reasons, the build process we use
to create these OS images wipes out the SSH host keys generated here
on our build system, else everyone's PiDP-8/I would have the same
host keys, which would be a massive security hole. Unfortunately,
the Raspbian `sshd` service 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.

You may be wondering why we don’t do this automatically, somehow. It’s
because, over time, we’ve removed all dependence on root access in our
software in the name of security, so that we no longer have permission
to make system-wide changes like this in our startup scripts.  We now
rely on you, the system’s administrator, to do it interactively with
`sudo` permissions.


<a id="systemd" name="unit"></a>
## The systemd Unit File

Older stable releases of the PiDP-8/I software used an [old-style System
V init script][svinit] to start the PiDP-8/I service. This includes
Oscar Vermeulen's final stable release.

Starting with release v2019.04.25, we have now switched to a
[systemd][systemd] unit file, since Raspbian has been systemd-based for
years. (It also supports SysV init scripts, but only as a second-class
mechanism intended for backwards compatibility only.)

One of the features systemd gives us is the ability to set the unit
to run as user-level service rather than as a system-wide service,
which means you no longer need the `sudo` prefix on commands to start,
stop, restart, and query the service. The only time you now need root
privileges is when installing the software. After that, the software
runs under your normal user account, as do all of the commands you
use to manipulate the background simulator service.

As a result of these changes, none of these commands work any longer:

    $ sudo /etc/init.d/pidp8i start
    $ sudo service pidp8i stop
    $ sudo systemctl restart pidp8i

The correct forms, respectively, are:

    $ systemctl --user start pidp8i
    $ systemctl --user stop pidp8i
    $ systemctl --user restart pidp8i

These commands are long, so we have extended the `pidp8i` command to
build and run `systemctl` commands for you when you pass it arguments:

    $ pidp8i start
    $ pidp8i stop
    $ pidp8i restart
    $ pidp8i status -l

If you run it without arguments, it attaches to the GNU screen(1)
session, just as before.

The last command above shows that *all* arguments are passed to
`systemctl`, not just the first, so you can pass flags and such.

The service is still set to start at boot, just as before.

To disable the service so you can run something else against the
PiDP-8/I front panel hardware instead, such as Deeper Thought 2:

    $ pidp8i stop
    $ pidp8i disable

If you install this release on a system that has the old SysV init
script on it, that service will be disabled and removed before we
install and enable the replacement systemd user service.

[svinit]:  https://en.wikipedia.org/wiki/Init#SysV-style
[systemd]: https://www.freedesktop.org/wiki/Software/systemd/



## License

Copyright © 2016-2019 by Warren Young. This document is licensed under
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]:  http://obsolescence.wixsite.com/obsolescence/2016-pidp-8-building-instructions
[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
[test]: 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
[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
Changes to SIMH-LICENSE.md.
1

2
3
4
5
6
7
8

1
2
3
4
5
6
7
8
-
+







Copyright © 2015-2017 by various authors
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
Changes to auto.def.
1
2
3
4
5

6
7
8
9
10
11
12
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-2019 Warren Young
# 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
39


40

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

58
59

60
61

62

63
64
65
66

67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

















100
101
102
103
104
105
106
32
33
34
35
36
37
38

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

59
60

61
62
63
64

65
66
67
68

69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88














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 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"
    ba          1  "*.BA BASIC games and demos"
    basic-games 1  "BASIC games and demos"
    cc8         1  "the native OS/8 CC8 compiler"
    chess       1  "the CHECKMO-II game of chess"
    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 69"
    focal69     0  "FOCAL,1969"
    fortran-ii  1  "FORTRAN II"
    fortran-iv  1  "FORTRAN IV"
    init        1  "the OS/8 INIT message"
    k12         1  "12-bit Kermit"
    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)"
    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 69 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"
    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
123

124
125
126
127
128
129
130
131
132
















133
134
135
136
137
138
139
122
123
124
125
126
127
128

129
130
131
132
133
134
135

136
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 meta-options
# 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
198
199




















200
201
202
203
204
205
206
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 our boot image. (Note, we ALWAYS apply patches.)
define OS8_BOOT_DISK "v3d.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
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
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
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 and some non-core modules.
set status [catch {exec python -c exit} result]
if {$status != 0} {
    user-error "Python 2 does not appear to be installed here.  It is required."
}
msg-result "Python 2 is installed here."
set status [catch {exec python -c "import pexpect" 2> /dev/null} result]
if {$status != 0} {
# 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 msg "The Python pexpect module is not installed here.  Fix with\n\n"
    append msg "    sudo apt install python-pip\n"
            set status [catch {exec python --version | grep -q 'Version 2'} result]
    append msg "    sudo pip install pexpect\n"
    append msg "\nOR:\n"
            set pyver [expr $status == 0 ? 2 : 3]
            set pycmd "python"
    append msg "\n    sudo easy_install pexpect\n"
    append msg "\nOR:\n"
        }
    }
}
if {$pyver == ""} {
    append msg "\n    sudo apt install python-pexpect\n"
    user-error $msg
    user-error "Python does not appear to be installed here.  It is required."
}
define PYCMD $pycmd
define PYVER $pyver
msg-result "Python module pexpect is installed here."
set status [catch {exec python -c "import pkg_resources" 2> /dev/null} result]
if {$status != 0} {
    set msg "The Python pkg_resources module is not installed here.  Fix with\n"
    append msg "\n    sudo pip install pkg_resources\n"
    append msg "\nOR:\n"
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 "\n    sudo easy_install pkg_resources\n"
    append msg "\nOR:\n"
    append msg "\n    sudo apt install python-pkg-resources\n"
    user-error $msg
}
msg-result "Python module pkg_resources is installed here."
        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
576
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
exec chmod +x "$builddir/bin/pidp8i" "$builddir/tools/simh-update" "$builddir/bin/os8-cp"
Deleted autosetup/Makefile.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28




























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# This is a convenience Makefile to do a few admin tasks
all:
	@echo "Try 'make reference' or './autosetup --help'"

VERSION := $(shell ./autosetup --version)

dist: clean
	@./autosetup --install=tmp/autosetup-$(VERSION) >/dev/null
	@tar -C tmp -czf autosetup-$(VERSION).tar.gz autosetup-$(VERSION)
	@rm -rf tmp
	@echo Created autosetup-$(VERSION).tar.gz

PAGER ?= less

help:
	./autosetup --help

ref reference:
	./autosetup --reference

html:
	./autosetup --reference=asciidoc | asciidoc -o autosetup-reference.html -

# Both tclsh8.5 and tclsh8.6 are required to run the top level test suite
test:
	@make -C testsuite test subdirtest
	@make -C testsuite autosetup_tclsh=tclsh8.6 test subdirtest
	@make -C testsuite autosetup_tclsh=tclsh8.5 test subdirtest
Changes to autosetup/README.autosetup.
1

2
3
4
5
6
7
8

1
2
3
4
5
6
7
8
-
+







README.autosetup created by autosetup v0.6.9
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.

Deleted autosetup/README.autosetup-lib.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15















-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
This README documents the 'lib' directory in the autosetup source repository.

*.tcl files in this directory are optional modules which
can be loaded with the 'use' directive.

Files named *.auto are auto-load modules.

Modules which are publically documented (those that contain @synopsis: ...), and auto-load modules are installed
stand-alone in a local autosetup installation to facilitate understanding by autosetup
end-users.

All other modules are private/internal and are combined with the
main autosetup script when installed.

A system-installed version of autosetup (--sysinstall) contains all modules.
Deleted autosetup/README.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




















































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
From the autosetup v0.6.2 User Manual...
========================================

autosetup is a tool, similar to autoconf, to configure a build system for
the appropriate environment, according to the system capabilities and the user
configuration.

autosetup is designed to be light-weight, fast, simple and flexible.

Notable features include:

  * Easily check for headers, functions, types for C/C++
  * Easily support user configuration options
  * Can generate files based on templates, such as Makefile.in => Makefile
  * Can generate header files based on checked features
  * Excellent support for cross compilation
  * Replacement for autoconf in many situations
  * Runs with either Tcl 8.5+, Jim Tcl or just a C compiler (using the
    included Jim Tcl source code!)
  * autosetup is intended to be distributed with projects - no version
    issues

autosetup is particularly targeted towards building C/C++ applications on Unix
systems, however it can be extended for other environments as needed.

autosetup is *not*:

  * A build system
  * A replacement for automake
  * Intended to replace all possible uses of autoconf

Try: ./autosetup --help or ./autosetup --reference

Or view the manual on github at:

  <http://msteveb.github.com/autosetup/>

Quick Start
-----------

To install autosetup into your project, 'cd' to the top level
of your project and run:

  &lt;path-to-autosetup&gt;/autosetup --install

Once autosetup is installed, create auto.def, run:

  ./configure

To migrate an autoconf-enabled project to autosetup:

  &lt;path-to-autosetup&gt;/migrate-autoconf
Deleted autosetup/TODO.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15















-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Wed 15 Dec 2010 07:31:39 EST
----------------------------

Expand the examples

Have 'autosetup --init' generate a typical Makefile.in if one doesn't exist.

autosetup should have a "meta-parse" phase to check that auto.def
includes modules before options, and has an options section.

Consider if we can get away without config.sub and config.guess.
Projects which need them could provide their own.
Many projects do not.

Unit tests.
Deleted autosetup/asciidoc-formatting.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2010 WorkWare Systems http://www.workware.net.au/
# All rights reserved

# Module which provides text formatting
# asciidoc format

use formatting

proc para {text} {
    regsub -all "\[ \t\n\]+" [string trim $text] " "
}
proc title {text} {
    underline [para $text] =
    nl
}
proc p {text} {
    puts [para $text]
    nl
}
proc code {text} {
    foreach line [parse_code_block $text] {
        puts "    $line"
    }
    nl
}
proc codelines {lines} {
    foreach line $lines {
        puts "    $line"
    }
    nl
}
proc nl {} {
    puts ""
}
proc underline {text char} {
    regexp "^(\[ \t\]*)(.*)" $text -> indent words
    puts $text
    puts $indent[string repeat $char [string length $words]]
}
proc section {text} {
    underline "[para $text]" -
    nl
}
proc subsection {text} {
    underline "$text" ~
    nl
}
proc bullet {text} {
    puts "* [para $text]"
}
proc indent {text} {
    puts " :: "
    puts [para $text]
}
proc defn {first args} {
    set sep ""
    if {$first ne ""} {
        puts "${first}::"
    } else {
        puts " :: "
    }
    set defn [string trim [join $args \n]]
    regsub -all "\n\n" $defn "\n ::\n" defn
    puts $defn
}
Changes to autosetup/autosetup.
1
2
3
4
5
6
7

8

9
10
11
12
13
14
15
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.6.9
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
95

96
97

98
99
100
101


102
103
104
105
106
107
108
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:=local  => "display help and options. Optionally specify a module name, such as --help=system"
		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"
		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"
		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
206


207
208
209







210
211
212
213
214
215

216
217
218


219
220
221
222
223
224
225
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)

	define CONFIGURE_OPTS ""
	# Add $argv to CONFIGURE_OPTS, but ignore duplicates and quote if needed
	set configure_opts {}
	foreach arg $autosetup(argv) {
		define-append CONFIGURE_OPTS [quote-if-needed $arg]
	}
		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]"

	# Note that auto.def is *not* loaded in the global scope
	source $autosetup(autodef)
	# 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
343
344


345
346
347
348
349
350
351
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(options-defaults) $opt]} {
				set result [dict get $autosetup(options-defaults) $opt]
			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
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
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 {header ""}} {
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) $opt ""
			lappend autosetup(optionhelp) [list $opt $autosetup(module)]
			set header {}
			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
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
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 {$colon eq ":"} {
				# Was ":name=default" given?
			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]} {
				# For backward compatibility, if ":name" was given, use name as both
				# the display text and the default value, but only if the user
				# specified the option without the value
				# 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
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
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]
			}
			#string match \n* $desc
			if {$header ne ""} {
				lappend autosetup(optionhelp) $header ""
				set header ""
			}
			# A multi-line description
			lappend autosetup(optionhelp) $opthelp $desc
			lappend autosetup(optionhelp) [list $opthelp $autosetup(module) $desc]
			incr i 2
		}
	}
}

# @module-options optionlist
#
# Like 'options', but used within a module.
# Deprecated. Simply use 'options' from within a module.
proc module-options {opts} {
	set header ""
	if {$::autosetup(showhelp) > 1 && [llength $opts]} {
		set header "Module Options:"
	}
	options-add $opts $header
	options $opts

	if {$::autosetup(showhelp)} {
		# Ensure that the module isn't executed on --help
		# We are running under eval or source, so use break
		# to prevent further execution
		#return -code break -level 2
		return -code break
	}
}

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


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
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 {} {
proc options-show {what} {
	set local 0
	# Determine the max option width
	set max 0
	foreach {opt desc} $::autosetup(optionhelp) {
	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 {opt desc} $::autosetup(optionhelp) {
	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
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
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 the form:
# An argument option (one which takes a parameter) is of one of the following forms:
#
## name:[=]value  => "Description of this option"
## 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 as the default
# 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
	# Allow options as a list or args
	options-add $optlist "Local Options:"

	options-add $optlist

	if {$::autosetup(showhelp)} {
	if {$autosetup(showhelp)} {
		options-show
		exit 0
		# 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"
		# 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
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
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)]} {
			automf_load eval $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]
				automf_load source $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] {
		automf_load eval $modsource($mod)
		autosetup_load_module $mod eval $modsource($mod)
	}
	# Now any external auto modules
	foreach file [glob -nocomplain $autosetup(libdir)/*.auto $autosetup(libdir)/*/*.auto] {
		automf_load source $file
		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
proc automf_load {args} {

	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
1437


1438
1439

1440
1441




1442
1443

1444
1445
1446
1447

1448
1449
1450
1451


1452

1453
1454
1455
1456
1457
1458
1459
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 eq "local"} {
    if {$what in {all local}} {
        # Need to load auto.def now
        if {[file exists $::autosetup(autodef)]} {
            # This relies on auto.def having a call to 'options'
            # Load auto.def as module "auto.def"
            # which will display options and quit
            source $::autosetup(autodef)
            autosetup_load_module auto.def source $::autosetup(autodef)
        }
        if {$what eq "all"} {
            set what *
        } else {
            options-show
            set what auto.def
        }
    } else {
        incr ::autosetup(showhelp)
        if {[catch {use $what}]} {
        use $what
            user-error "Unknown module: $what"
        } else {
            options-show
        }
        puts "Options for module $what:"
    }
    }
    options-show $what
    exit 0
}

proc autosetup_show_license {} {
    global modsource autosetup
    use_pager

Changes to autosetup/autosetup-find-tclsh.
1
2
3
4
5



6
7
8

9
10
11
12
13
14


15
16
17
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 from source
# Prefer $autosetup_tclsh if is set in the environment
d=`dirname "$0"`
# 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"`"
{ "$d/jimsh0" "$d/autosetup-test-tclsh"; } 2>/dev/null && exit 0
PATH="$PATH:$d"; export PATH
for tclsh in $autosetup_tclsh jimsh tclsh tclsh8.5 tclsh8.6; do
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 "$d/jimsh0" "$d/jimsh0.c"; } 2>/dev/null || continue
	"$d/jimsh0" "$d/autosetup-test-tclsh" && exit 0
	{ $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
Changes to autosetup/cc-db.tcl.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
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

module-options {}
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
Changes to autosetup/cc-lib.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

module-options {}

# @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
#
Changes to autosetup/cc-shared.tcl.
16
17
18
19
20
21
22
23

24
25
26
27
28
29
30
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

module-options {}
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
Changes to autosetup/cc.tcl.
25
26
27
28
29
30
31
32

33
34
35
36
37
38
39
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39







-
+







## CPPFLAGS
## LINKFLAGS
## CC_FOR_BUILD
## LD

use system

module-options {}
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
683

684
685
686
687

688
689
690
691
692
693
694
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
# Note that if CXX isn't found, we just set it to "false". It might not be needed.
# 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++ false]
	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]
Deleted autosetup/formatting.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52




















































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2010 WorkWare Systems http://www.workware.net.au/
# All rights reserved

# Module which provides common text formatting

# This is designed for documenation which looks like:
# code {...}
# or
# code {
#    ...
#    ...
# }
# In the second case, we need to work out the indenting
# and strip it from all lines but preserve the remaining indenting.
# Note that all lines need to be indented with the same initial
# spaces/tabs.
#
# Returns a list of lines with the indenting removed.
#
proc parse_code_block {text} {
    # If the text begins with newline, take the following text,
    # otherwise just return the original
    if {![regexp "^\n(.*)" $text -> text]} {
        return [list [string trim $text]]
    }

    # And trip spaces off the end
    set text [string trimright $text]

    set min 100
    # Examine each line to determine the minimum indent
    foreach line [split $text \n] {
        if {$line eq ""} {
            # Ignore empty lines for the indent calculation
            continue
        }
        regexp "^(\[ \t\]*)" $line -> indent
        set len [string length $indent]
        if {$len < $min} {
            set min $len
        }
    }

    # Now make a list of lines with this indent removed
    set lines {}
    foreach line [split $text \n] {
        lappend lines [string range $line $min end]
    }

    # Return the result
    return $lines
}
Deleted autosetup/getopt.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54






















































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2006 WorkWare Systems http://www.workware.net.au/
# All rights reserved

# Simple getopt module

# Parse everything out of the argv list which looks like an option
# Everything which doesn't look like an option, or is after --, is left unchanged
# Understands --enable-xxx as a synonym for --xxx to enable the boolean option xxx.
# Understands --disable-xxx to disable the boolean option xxx.
#
# The returned value is a dictionary keyed by option name
# Each value is a list of {type value} ... where type is "bool" or "str".
# The value for a boolean option is 0 or 1. The value of a string option is the value given.
proc getopt {argvname} {
	upvar $argvname argv
	set nargv {}

	set opts {}

	for {set i 0} {$i < [llength $argv]} {incr i} {
		set arg [lindex $argv $i]

		#dputs arg=$arg

		if {$arg eq "--"} {
			# End of options
			incr i
			lappend nargv {*}[lrange $argv $i end]
			break
		}

		if {[regexp {^--([^=][^=]+)=(.*)$} $arg -> name value]} {
			# --name=value
			dict lappend opts $name [list str $value]
		} elseif {[regexp {^--(enable-|disable-)?([^=]*)$} $arg -> prefix name]} {
			if {$prefix in {enable- ""}} {
				set value 1
			} else {
				set value 0
			}
			dict lappend opts $name [list bool $value]
		} else {
			lappend nargv $arg
		}
	}

	#puts "getopt: argv=[join $argv] => [join $nargv]"
	#array set getopt $opts
	#parray getopt

	set argv $nargv

	return $opts
}
Deleted autosetup/help.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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


















































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2010 WorkWare Systems http://workware.net.au/
# All rights reserved

# Module which provides usage, help and the command reference

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 eq "local"} {
        if {[file exists $::autosetup(autodef)]} {
            # This relies on auto.def having a call to 'options'
            # which will display options and quit
            source $::autosetup(autodef)
        } else {
            options-show
        }
    } else {
        incr ::autosetup(showhelp)
        if {[catch {use $what}]} {
            user-error "Unknown module: $what"
        } else {
            options-show
        }
    }
    exit 0
}

proc autosetup_show_license {} {
    global modsource autosetup
    use_pager

    if {[info exists modsource(LICENSE)]} {
        puts $modsource(LICENSE)
        return
    }
    foreach dir [list $autosetup(libdir) $autosetup(srcdir)] {
        set path [file join $dir LICENSE]
        if {[file exists $path]} {
            puts [readfile $path]
            return
        }
    }
    puts "LICENSE not found"
}

# If not already paged and stdout is a tty, pipe the output through the pager
# This is done by reinvoking autosetup with --nopager added
proc use_pager {} {
    if {![opt-bool nopager] && [getenv PAGER ""] ne "" && [isatty? stdin] && [isatty? stdout]} {
        if {[catch {
            exec [info nameofexecutable] $::argv0 --nopager {*}$::argv |& {*}[getenv PAGER] >@stdout <@stdin 2>@stderr
        } msg opts] == 1} {
            if {[dict get $opts -errorcode] eq "NONE"} {
                # an internal/exec error
                puts stderr $msg
                exit 1
            }
        }
        exit 0
    }
}

# Outputs the autosetup references in one of several formats
proc autosetup_reference {{type text}} {

    use_pager

    switch -glob -- $type {
        wiki {use wiki-formatting}
        ascii* {use asciidoc-formatting}
        md - markdown {use markdown-formatting}
        default {use text-formatting}
    }

    title "[autosetup_version] -- Command Reference"

    section {Introduction}

    p {
        See http://msteveb.github.com/autosetup/ for the online documentation for 'autosetup'
    }

    p {
        'autosetup' provides a number of built-in commands which
        are documented below. These may be used from 'auto.def' to test
        for features, define variables, create files from templates and
        other similar actions.
    }

    automf_command_reference

    exit 0
}

proc autosetup_output_block {type lines} {
    if {[llength $lines]} {
        switch $type {
            section {
                section $lines
            }
            subsection {
                subsection $lines
            }
            code {
                codelines $lines
            }
            p {
                p [join $lines]
            }
            list {
                foreach line $lines {
                    bullet $line
                }
                nl
            }
        }
    }
}

# Generate a command reference from inline documentation
proc automf_command_reference {} {
    lappend files $::autosetup(prog)
    lappend files {*}[lsort [glob -nocomplain $::autosetup(libdir)/*.tcl]]

    # We want to process all non-module files before module files
    # and then modules in alphabetical order.
    # So examine all files and extract docs into doc($modulename) and doc(_core_)
    #
    # Each entry is a list of {type data} where $type is one of: section, subsection, code, list, p
    # and $data is a string for section, subsection or a list of text lines for other types.

    # XXX: Should commands be in alphabetical order too? Currently they are in file order.

    set doc(_core_) {}
    lappend doc(_core_) [list section "Core Commands"]

    foreach file $files {
        set modulename [file rootname [file tail $file]]
        set current _core_
        set f [open $file]
        while {![eof $f]} {
            set line [gets $f]

            # Find embedded module names
            if {[regexp {^#.*@module ([^ ]*)} $line -> modulename]} {
                continue
            }

            # Find lines starting with "# @*" and continuing through the remaining comment lines
            if {![regexp {^# @(.*)} $line -> cmd]} {
                continue
            }

            # Synopsis or command?
            if {$cmd eq "synopsis:"} {
                set current $modulename
                lappend doc($current) [list section "Module: $modulename"]
            } else {
                lappend doc($current) [list subsection $cmd]
            }

            set lines {}
            set type p

            # Now the description
            while {![eof $f]} {
                set line [gets $f]

                if {![regexp {^#(#)? ?(.*)} $line -> hash cmd]} {
                    break
                }
                if {$hash eq "#"} {
                    set t code
                } elseif {[regexp {^- (.*)} $cmd -> cmd]} {
                    set t list
                } else {
                    set t p
                }

                #puts "hash=$hash, oldhash=$oldhash, lines=[llength $lines], cmd=$cmd"

                if {$t ne $type || $cmd eq ""} {
                    # Finish the current block
                    lappend doc($current) [list $type $lines]
                    set lines {}
                    set type $t
                }
                if {$cmd ne ""} {
                    lappend lines $cmd
                }
            }

            lappend doc($current) [list $type $lines]
        }
        close $f
    }

    # Now format and output the results

    # _core_ will sort first
    foreach module [lsort [array names doc]] {
        foreach item $doc($module) {
            autosetup_output_block {*}$item
        }
    }
}
Deleted autosetup/init.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54






















































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2010 WorkWare Systems http://www.workware.net.au/
# All rights reserved

# Module to help create auto.def and configure

proc autosetup_init {type} {
	set help 0
	if {$type in {? help}} {
		incr help
	} elseif {![dict exists $::autosetup(inittypes) $type]} {
		puts "Unknown type, --init=$type"
		incr help
	}
	if {$help} {
		puts "Use one of the following types (e.g. --init=make)\n"
		foreach type [lsort [dict keys $::autosetup(inittypes)]] {
			lassign [dict get $::autosetup(inittypes) $type] desc
			# XXX: Use the options-show code to wrap the description
			puts [format "%-10s %s" $type $desc]
		}
		return
	}
	lassign [dict get $::autosetup(inittypes) $type] desc script

	puts "Initialising $type: $desc\n"

	# All initialisations happens in the top level srcdir
	cd $::autosetup(srcdir)

	uplevel #0 $script
}

proc autosetup_add_init_type {type desc script} {
	dict set ::autosetup(inittypes) $type [list $desc $script]
}

# This is for in creating build-system init scripts
#
# If the file doesn't exist, create it containing $contents
# If the file does exist, only overwrite if --force is specified.
#
proc autosetup_check_create {filename contents} {
	if {[file exists $filename]} {
		if {!$::autosetup(force)} {
			puts "I see $filename already exists."
			return
		} else {
			puts "I will overwrite the existing $filename because you used --force."
		}
	} else {
		puts "I don't see $filename, so I will create it."
	}
	writefile $filename $contents
}
Deleted autosetup/install.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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



















































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2006-2010 WorkWare Systems http://www.workware.net.au/
# All rights reserved

# Module which can install autosetup

# autosetup(installed)=1 means that autosetup is not running from source
# autosetup(sysinstall)=1 means that autosetup is running from a sysinstall verion
# shared=1 means that we are trying to do a sysinstall. This is only possible from the development source.

proc autosetup_install {dir {shared 0}} {
	if {$shared && $::autosetup(installed)} {
		user-error "Can only --sysinstall from development sources"
	}

	if {$::autosetup(sysinstall)} {
		# This is the sysinstall version, so install just uses references
		cd $dir

		puts "[autosetup_version] creating configure to use system-installed autosetup"
		autosetup_create_configure 1
		puts "Creating autosetup/README.autosetup"
		file mkdir autosetup
		autosetup_install_readme autosetup/README.autosetup 1
		return
	}

	if {[catch {
		if {$shared} {
			set target $dir/bin/autosetup
			set installedas $target
		} else {
			if {$dir eq "."} {
				set installedas autosetup
			} else {
				set installedas $dir/autosetup
			}
			cd $dir
			file mkdir autosetup
			set target autosetup/autosetup
		}
		set targetdir [file dirname $target]
		file mkdir $targetdir

		set f [open $target w]

		set publicmodules {}

		# First the main script, but only up until "CUT HERE"
		set in [open $::autosetup(dir)/autosetup]
		while {[gets $in buf] >= 0} {
			if {$buf ne "##-- CUT HERE --##"} {
				puts $f $buf
				continue
			}

			# Insert the static modules here
			# i.e. those which don't contain @synopsis:
			# All modules are inserted if $shared is set
			puts $f "set autosetup(installed) 1"
			puts $f "set autosetup(sysinstall) $shared"
			foreach file [lsort [glob $::autosetup(libdir)/*.{tcl,auto}]] {
				set modname [file tail $file]
				set ext [file ext $modname]
				set buf [readfile $file]
				if {!$shared} {
					if {$ext eq ".auto" || [string match "*\n# @synopsis:*" $buf]} {
						lappend publicmodules $file
						continue
					}
				}
				dputs "install: importing lib/[file tail $file]"
				puts $f "# ----- @module $modname -----"
				puts $f "\nset modsource($modname) \{"
				puts $f $buf
				puts $f "\}\n"
			}
			if {$shared} {
				foreach {srcname destname} [list $::autosetup(libdir)/README.autosetup-lib README.autosetup \
						$::autosetup(srcdir)/LICENSE LICENSE] {
					dputs "install: importing $srcname as $destname"
					puts $f "\nset modsource($destname) \\\n[list [readfile $srcname]\n]\n"
				}
			}
		}
		close $in
		close $f
		exec chmod 755 $target

		set installfiles {autosetup-config.guess autosetup-config.sub autosetup-test-tclsh}
		set removefiles {}

		if {!$shared} {
			autosetup_install_readme $targetdir/README.autosetup 0

			# Install public modules
			foreach file $publicmodules {
				set tail [file tail $file]
				autosetup_install_file $file $targetdir/$tail
			}
			lappend installfiles jimsh0.c autosetup-find-tclsh LICENSE
			lappend removefiles config.guess config.sub test-tclsh find-tclsh
		} else {
			lappend installfiles {sys-find-tclsh autosetup-find-tclsh}
		}

		# Install support files
		foreach fileinfo $installfiles {
			if {[llength $fileinfo] == 2} {
				lassign $fileinfo source dest
			} else {
				lassign $fileinfo source
				set dest $source
			}
			autosetup_install_file $::autosetup(dir)/$source $targetdir/$dest
			exec chmod 755 $targetdir/$dest
		}

		# Remove obsolete files
		foreach file $removefiles {
			if {[file exists $targetdir/$file]} {
				file delete $targetdir/$file
			}
		}
	} error]} {
		user-error "Failed to install autosetup: $error"
	}
	if {$shared} {
		set type "system"
	} else {
		set type "local"
	}
	puts "Installed $type [autosetup_version] to $installedas"

	if {!$shared} {
		# Now create 'configure' if necessary
		autosetup_create_configure 0
	}
}

proc autosetup_create_configure {shared} {
	if {[file exists configure]} {
		if {!$::autosetup(force)} {
			# Could this be an autosetup configure?
			if {![string match "*\nWRAPPER=*" [readfile configure]]} {
				puts "I see configure, but not created by autosetup, so I won't overwrite it."
				puts "Remove it or use --force to overwrite."
				return
			}
		} else {
			puts "I will overwrite the existing configure because you used --force."
		}
	} else {
		puts "I don't see configure, so I will create it."
	}
	if {$shared} {
		writefile configure \
{#!/bin/sh
# Note that WRAPPER is set here purely to detect an autosetup-created script
WRAPPER="-"; "autosetup" "$@"
}
	} else {
		writefile configure \
{#!/bin/sh
dir="`dirname "$0"`/autosetup"
WRAPPER="$0"; export WRAPPER; exec "`$dir/autosetup-find-tclsh`" "$dir/autosetup" "$@"
}
	}
	catch {exec chmod 755 configure}
}

# Append the contents of $file to filehandle $f
proc autosetup_install_append {f file} {
	dputs "install: include $file"
	set in [open $file]
	puts $f [read $in]
	close $in
}

proc autosetup_install_file {source target} {
	dputs "install: $source => $target"
	if {![file exists $source]} {
		error "Missing installation file '$source'"
	}
	writefile $target [readfile $source]\n
}

proc autosetup_install_readme {target sysinstall} {
	set readme "README.autosetup created by [autosetup_version]\n\n"
	if {$sysinstall} {
		append readme \
{This is the autosetup directory for a system install of autosetup.
Loadable modules can be added here.
}
	} else {
		append readme \
{This is the autosetup directory for a local install of autosetup.
It contains autosetup, support files and loadable modules.
}
}

	append readme {
*.tcl files in this directory are optional modules which
can be loaded with the 'use' directive.

*.auto files in this directory are auto-loaded.

For more information, see http://msteveb.github.com/autosetup/
}
	dputs "install: autosetup/README.autosetup"
	writefile $target $readme
}
Changes to autosetup/jimsh0.c.
55
56
57
58
59
60
61
62

63
64
65
66
67
68
69
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 77
#define JIM_VERSION 78
#ifndef JIM_WIN32COMPAT_H
#define JIM_WIN32COMPAT_H



#ifdef __cplusplus
extern "C" {
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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);

#elif defined(__MINGW32__)

#include <stdlib.h>
#define strtod __strtod

#endif

#endif

#ifdef __cplusplus
}
#endif
371
372
373
374
375
376
377






378
379
380
381
382
383
384
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
415
416
417
418
419
420
421
422
423
424
425
426
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 {
            void *compre;
            unsigned flags;
        } regexpValue;
        struct {
            int line;
            int argc;
        } scriptLineValue;
    } internalRep;
    struct Jim_Obj *prevObjPtr;
    struct Jim_Obj *nextObjPtr;
570
571
572
573
574
575
576
577

578
579
580
581
582
583
584
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 -1 while the collection
                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
642

643
644
645
646
647
648
649
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);
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
850

851
852
853
854
855
856
857
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_Obj **exprResultPtrPtr);
        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
907


908
909
910
911
912
913
914
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(const char *prompt);
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
1066

1067
1068




1069
1070


1071
1072
1073
1074
1075
1076
1077
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} {\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 $path/$pkg.tcl]} {\n"
"				uplevel #0 [list source $path/$pkg.tcl]\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
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
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
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
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 [socket pipe] r w\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 { os.wait $p }\n"
"				return\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
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
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

1852




1853
1854
1855
1856
1857
1858
1859
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
#define JimCheckStreamError(interp, af) af->fops->error(af)

#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
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
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
2229

2230
2231
2232
2233
2234
2235
2236
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(JIM_ANSIC) && defined(HAVE_SHUTDOWN)
#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
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
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
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
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 !defined(JIM_ANSIC)
        if (fd >= 0) {
#ifndef JIM_ANSIC
            fh = fdopen(fd, mode);
#endif
        }
        else
#endif
            fh = fopen(Jim_String(filename), mode);

        if (fh == NULL) {
            JimAioSetError(interp, filename);
#if !defined(JIM_ANSIC)
#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->fd = fileno(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
    af->openFlags = openFlags;
#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


int Jim_MakeTempFile(Jim_Interp *interp, const char *filename_template)
#ifdef HAVE_PIPE
static int JimAioPipeCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
#ifdef HAVE_MKSTEMP
    int fd;
    int p[2];
    mode_t mask;
    Jim_Obj *filenameObj;

    static const char *mode[2] = { "r", "w" };
    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);
    if (argc != 1) {
        Jim_WrongNumArgs(interp, 1, argv, "");
        }
        Jim_AppendString(interp, filenameObj, "tcl.tmp.XXXXXX", -1);
    }
    else {
        return JIM_ERR;
        filenameObj = Jim_NewStringObj(interp, filename_template, -1);
    }


    if (pipe(p) != 0) {
    mask = umask(S_IXUSR | S_IRWXG | S_IRWXO);
    fd = mkstemp(filenameObj->bytes);
    umask(mask);
    if (fd < 0) {
        JimAioSetError(interp, filenameObj);
        JimAioSetError(interp, NULL);
        Jim_FreeNewObj(interp, filenameObj);
        return -1;
        return JIM_ERR;
    }

    Jim_SetResult(interp, filenameObj);
    return fd;
    return JimMakeChannelPair(interp, p, argv[0], "aio.pipe%ld", 0, mode);
#else
    Jim_SetResultString(interp, "platform has no tempfile support", -1);
    return -1;
}
#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);
#ifndef JIM_ANSIC
#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
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
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.regexpValue.compre);
    Jim_Free(objPtr->internalRep.regexpValue.compre);
    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 == &regexpObjType &&
        objPtr->internalRep.regexpValue.compre && objPtr->internalRep.regexpValue.flags == flags) {
        objPtr->internalRep.ptrIntValue.ptr && objPtr->internalRep.ptrIntValue.int1 == flags) {

        return objPtr->internalRep.regexpValue.compre;
        return objPtr->internalRep.ptrIntValue.ptr;
    }




    pattern = Jim_String(objPtr);
    compre = Jim_Alloc(sizeof(regex_t));
2868
2869
2870
2871
2872
2873
2874
2875
2876


2877
2878
2879
2880
2881
2882
2883
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 = &regexpObjType;
    objPtr->internalRep.regexpValue.flags = flags;
    objPtr->internalRep.regexpValue.compre = compre;
    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
3338

3339
3340
3341
3342
3343







3344
3345
3346
3347
3348
3349
3350
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(_MSC_VER)
#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
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
3718

3719
3720
3721
3722
3723
3724
3725
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);
    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
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
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) {
#ifdef HAVE_UTIMES
        jim_wide newtime;
        jim_wide secs;
        struct timeval times[2];

        if (Jim_GetWide(interp, argv[1], &newtime) != JIM_OK) {
        if (Jim_GetWide(interp, argv[1], &secs) != JIM_OK) {
            return JIM_ERR;
        }

        times[1].tv_sec = times[0].tv_sec = newtime;
        times[1].tv_usec = times[0].tv_usec = 0;

        if (utimes(Jim_String(argv[0]), times) != 0) {
        return JimSetFileTimes(interp, Jim_String(argv[0]), secs * 1000000);
            Jim_SetResultFormatted(interp, "can't set time on \"%#s\": %s", argv[0], strerror(errno));
            return JIM_ERR;
        }
#else
        Jim_SetResultString(interp, "Not implemented", -1);
        return JIM_ERR;
#endif
    }
    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
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
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
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>

#if defined(__MINGW32__)

    #ifndef STRICT
    #define STRICT
    #endif
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <fcntl.h>

    typedef HANDLE fdtype;
    typedef HANDLE pidtype;
    #define JIM_BAD_FD INVALID_HANDLE_VALUE
    #define JIM_BAD_PID INVALID_HANDLE_VALUE
    #define JimCloseFd CloseHandle

    #define WIFEXITED(STATUS) 1
    #define WEXITSTATUS(STATUS) (STATUS)
    #define WIFSIGNALED(STATUS) 0
    #define WTERMSIG(STATUS) 0
    #define WNOHANG 1

    static fdtype JimFileno(FILE *fh);
    static pidtype JimWaitPid(pidtype pid, int *status, int nohang);
    static fdtype JimDupFd(fdtype infd);
    static fdtype JimOpenForRead(const char *filename);
    static FILE *JimFdOpenForRead(fdtype fd);
    static int JimPipe(fdtype pipefd[2]);
    static pidtype JimStartWinProcess(Jim_Interp *interp, char **argv, char **env,
        fdtype inputId, fdtype outputId, fdtype errorId);
    static int JimErrno(void);
#else
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/wait.h>
    #include <sys/stat.h>
#include <sys/stat.h>

    typedef int fdtype;
    typedef int pidtype;
    #define JimPipe pipe
    #define JimErrno() errno
    #define JIM_BAD_FD -1
    #define JIM_BAD_PID -1
    #define JimFileno fileno
    #define JimReadFd read
    #define JimCloseFd close
    #define JimWaitPid waitpid
    #define JimDupFd dup
    #define JimFdOpenForRead(FD) fdopen((FD), "r")
    #define JimOpenForRead(NAME) open((NAME), O_RDONLY, 0)

struct WaitInfoTable;
    #ifndef HAVE_EXECVPE
        #define execvpe(ARG0, ARGV, ENV) execvp(ARG0, ARGV)
    #endif
#endif

static const char *JimStrError(void);
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, fdtype *inPipePtr, fdtype *outPipePtr, fdtype *errFilePtr);
static void JimDetachPids(Jim_Interp *interp, int numPids, const pidtype *pidPtr);
    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 fdtype JimCreateTemp(Jim_Interp *interp, const char *contents, int len);
static int Jim_WaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
static fdtype JimOpenForWrite(const char *filename, int append);
static int JimRewindFd(fdtype fd);

#if defined(__MINGW32__)
static void Jim_SetResultErrno(Jim_Interp *interp, const char *msg)
static pidtype JimStartWinProcess(Jim_Interp *interp, char **argv, char **env, int inputId, int outputId, int errorId);
{
    Jim_SetResultFormatted(interp, "%s: %s", msg, JimStrError());
}

#endif
static const char *JimStrError(void)
{
    return strerror(JimErrno());
}

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, fdtype fd, Jim_Obj *strObj)
static int JimAppendStreamToString(Jim_Interp *interp, int fd, Jim_Obj *strObj)
{
    char buf[256];
    FILE *fh = JimFdOpenForRead(fd);
    FILE *fh = fdopen(fd, "r");
    int ret = 0;

    if (fh == NULL) {
        return -1;
    }

    while (1) {
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
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);
    }
}

#ifndef jim_ext_signal

const char *Jim_SignalId(int sig)
{
    static char buf[10];
    snprintf(buf, sizeof(buf), "%d", sig);
    return buf;
}

const char *Jim_SignalName(int sig)
{
    return Jim_SignalId(sig);
}
#endif

static int JimCheckWaitStatus(Jim_Interp *interp, pidtype pid, int waitStatus, Jim_Obj *errStrObj)
static Jim_Obj *JimMakeErrorCode(Jim_Interp *interp, pidtype pid, int waitStatus, Jim_Obj *errStrObj)
{
    Jim_Obj *errorCode;
    Jim_Obj *errorCode = Jim_NewListObj(interp, NULL, 0);

    if (WIFEXITED(waitStatus) && WEXITSTATUS(waitStatus) == 0) {
        return JIM_OK;
    if (pid == JIM_BAD_PID || pid == JIM_NO_PID) {
    }
    errorCode = Jim_NewListObj(interp, NULL, 0);

    if (WIFEXITED(waitStatus)) {
        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, Jim_SignalId(WTERMSIG(waitStatus)), -1));
        Jim_ListAppendElement(interp, errorCode, Jim_NewStringObj(interp, Jim_SignalName(WTERMSIG(waitStatus)), -1));
        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", errorCode);
    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);
        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)
{
    fdtype outputId;
    fdtype errorId;
    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(interp, numPids, pidPtr);
        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 != JIM_BAD_FD) {
    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 != JIM_BAD_FD) {
    if (errorId != -1) {
        int ret;
        JimRewindFd(errorId);
        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
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
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 = JimWaitPid(waitPtr->pid, &status, WNOHANG);
            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 pidtype JimWaitForProcess(struct WaitInfoTable *table, pidtype pid, int *statusPtr)
{
    int i;


static int Jim_WaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
    for (i = 0; i < table->used; i++) {
        if (pid == table->info[i].pid) {

            JimWaitPid(pid, statusPtr, 0);


            if (i != table->used - 1) {
                table->info[i] = table->info[table->used - 1];
            }
            table->used--;
            return pid;
        }
    }


    return JIM_BAD_PID;
}

static void JimDetachPids(Jim_Interp *interp, int numPids, const pidtype *pidPtr)
{
    int j;
    struct WaitInfoTable *table = Jim_CmdPrivData(interp);
    int nohang = 0;
    pidtype pid;
    long pidarg;
    int status;
    Jim_Obj *errCodeObj;

    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;
            }
        }
    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;
}

static FILE *JimGetAioFilehandle(Jim_Interp *interp, const char *name)
{
    FILE *fh;
    Jim_Obj *fhObj;

    fhObj = Jim_NewStringObj(interp, name, -1);
    Jim_IncrRefCount(fhObj);
    }
    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;
}

    fh = Jim_AioFilehandle(interp, fhObj);
    Jim_DecrRefCount(interp, fhObj);

    return fh;
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,
    fdtype *inPipePtr, fdtype *outPipePtr, fdtype *errFilePtr)
    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
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
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. */
    fdtype inputId = JIM_BAD_FD;
    fdtype outputId = JIM_BAD_FD;
    fdtype errorId = JIM_BAD_FD;
    fdtype lastOutputId = JIM_BAD_FD;
    fdtype pipeIds[2];
    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;

    JimReapDetachedPids(table);

    if (inPipePtr != NULL) {
        *inPipePtr = JIM_BAD_FD;
        *inPipePtr = -1;
    }
    if (outPipePtr != NULL) {
        *outPipePtr = JIM_BAD_FD;
        *outPipePtr = -1;
    }
    if (errFilePtr != NULL) {
        *errFilePtr = JIM_BAD_FD;
        *errFilePtr = -1;
    }
    pipeIds[0] = pipeIds[1] = JIM_BAD_FD;
    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
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
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 = JimCreateTemp(interp, input, input_len);
            if (inputId == JIM_BAD_FD) {
            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;
        }
        else if (inputFile == FILE_HANDLE) {

            FILE *fh = JimGetAioFilehandle(interp, input);
            }
            lseek(inputId, 0L, SEEK_SET);
        }
        else if (inputFile == FILE_HANDLE) {
            int fd = JimGetChannelFd(interp, input);

            if (fh == NULL) {
            if (fd < 0) {
                goto error;
            }
            inputId = JimDupFd(JimFileno(fh));
            inputId = dup(fd);
        }
        else {
            inputId = JimOpenForRead(input);
            if (inputId == JIM_BAD_FD) {
                Jim_SetResultFormatted(interp, "couldn't read file \"%s\": %s", input, JimStrError());
            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 (JimPipe(pipeIds) != 0) {
        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] = JIM_BAD_FD;
        pipeIds[0] = pipeIds[1] = -1;
    }

    if (output != NULL) {
        if (outputFile == FILE_HANDLE) {
            FILE *fh = JimGetAioFilehandle(interp, output);
            if (fh == NULL) {
            int fd = JimGetChannelFd(interp, output);
            if (fd < 0) {
                goto error;
            }
            fflush(fh);
            lastOutputId = JimDupFd(JimFileno(fh));
            lastOutputId = dup(fd);
        }
        else {
            lastOutputId = JimOpenForWrite(output, outputFile == FILE_APPEND);
            if (lastOutputId == JIM_BAD_FD) {
                Jim_SetResultFormatted(interp, "couldn't write file \"%s\": %s", output, JimStrError());
            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 (JimPipe(pipeIds) != 0) {
        if (pipe(pipeIds) != 0) {
            Jim_SetResultErrno(interp, "couldn't create output pipe");
            goto error;
        }
        lastOutputId = pipeIds[1];
        *outPipePtr = pipeIds[0];
        pipeIds[0] = pipeIds[1] = JIM_BAD_FD;
        pipeIds[0] = pipeIds[1] = -1;
    }

    if (error != NULL) {
        if (errorFile == FILE_HANDLE) {
            if (strcmp(error, "1") == 0) {

                if (lastOutputId != JIM_BAD_FD) {
                    errorId = JimDupFd(lastOutputId);
                if (lastOutputId != -1) {
                    errorId = dup(lastOutputId);
                }
                else {

                    error = "stdout";
                }
            }
            if (errorId == JIM_BAD_FD) {
                FILE *fh = JimGetAioFilehandle(interp, error);
                if (fh == NULL) {
            if (errorId == -1) {
                int fd = JimGetChannelFd(interp, error);
                if (fd < 0) {
                    goto error;
                }
                fflush(fh);
                errorId = JimDupFd(JimFileno(fh));
                errorId = dup(fd);
            }
        }
        else {
            errorId = JimOpenForWrite(error, errorFile == FILE_APPEND);
            if (errorId == JIM_BAD_FD) {
                Jim_SetResultFormatted(interp, "couldn't write file \"%s\": %s", error, JimStrError());
            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 = JimCreateTemp(interp, NULL, 0);
        if (errorId == JIM_BAD_FD) {
        errorId = Jim_MakeTempFile(interp, NULL, 1);
        if (errorId == -1) {
            goto error;
        }
        *errFilePtr = JimDupFd(errorId);
        *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;
        fdtype origErrorId = errorId;
        int origErrorId = errorId;

        for (lastArg = firstArg; lastArg < arg_count; lastArg++) {
            if (arg_array[lastArg][0] == '|') {
                if (arg_array[lastArg][1] == '&') {
                    pipe_dup_err = 1;
            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 (JimPipe(pipeIds) != 0) {
            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, 0);
            if (outputId != -1) dup2(outputId, 1);
            if (errorId != -1) dup2(errorId, 2);

            for (i = 3; (i <= outputId) || (i <= inputId) || (i <= errorId); i++) {
                close(i);
            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], Jim_GetEnviron());
            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)) {

            fprintf(stderr, "couldn't exec \"%s\"\n", arg_array[firstArg]);
            }
#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
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
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 != JIM_BAD_FD) {
            JimCloseFd(inputId);
        if (inputId != -1) {
            close(inputId);
        }
        if (outputId != JIM_BAD_FD) {
            JimCloseFd(outputId);
        if (outputId != -1) {
            close(outputId);
            outputId = JIM_BAD_FD;
        }
        inputId = pipeIds[0];
        pipeIds[0] = pipeIds[1] = JIM_BAD_FD;
        pipeIds[0] = pipeIds[1] = -1;
    }
    *pidArrayPtr = pidPtr;


  cleanup:
    if (inputId != JIM_BAD_FD) {
        JimCloseFd(inputId);
    if (inputId != -1) {
        close(inputId);
    }
    if (lastOutputId != JIM_BAD_FD) {
        JimCloseFd(lastOutputId);
    if (lastOutputId != -1) {
        close(lastOutputId);
    }
    if (errorId != JIM_BAD_FD) {
        JimCloseFd(errorId);
    if (errorId != -1) {
        close(errorId);
    }
    Jim_Free(arg_array);

    JimRestoreEnv(save_environ);

    return numPids;


  error:
    if ((inPipePtr != NULL) && (*inPipePtr != JIM_BAD_FD)) {
        JimCloseFd(*inPipePtr);
        *inPipePtr = JIM_BAD_FD;
    if ((inPipePtr != NULL) && (*inPipePtr != -1)) {
        close(*inPipePtr);
        *inPipePtr = -1;
    }
    if ((outPipePtr != NULL) && (*outPipePtr != JIM_BAD_FD)) {
        JimCloseFd(*outPipePtr);
        *outPipePtr = JIM_BAD_FD;
    if ((outPipePtr != NULL) && (*outPipePtr != -1)) {
        close(*outPipePtr);
        *outPipePtr = -1;
    }
    if ((errFilePtr != NULL) && (*errFilePtr != JIM_BAD_FD)) {
        JimCloseFd(*errFilePtr);
        *errFilePtr = JIM_BAD_FD;
    if ((errFilePtr != NULL) && (*errFilePtr != -1)) {
        close(*errFilePtr);
        *errFilePtr = -1;
    }
    if (pipeIds[0] != JIM_BAD_FD) {
        JimCloseFd(pipeIds[0]);
    if (pipeIds[0] != -1) {
        close(pipeIds[0]);
    }
    if (pipeIds[1] != JIM_BAD_FD) {
        JimCloseFd(pipeIds[1]);
    if (pipeIds[1] != -1) {
        close(pipeIds[1]);
    }
    if (pidPtr != NULL) {
        for (i = 0; i < numPids; i++) {
            if (pidPtr[i] != JIM_BAD_PID) {
                JimDetachPids(interp, 1, &pidPtr[i]);
                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

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
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, JimAllocWaitInfoTable(), JimFreeWaitInfoTable);
    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 SECURITY_ATTRIBUTES *JimStdSecAttrs(void)
{
    static SECURITY_ATTRIBUTES secAtts;

    secAtts.nLength = sizeof(SECURITY_ATTRIBUTES);
    secAtts.lpSecurityDescriptor = NULL;
    secAtts.bInheritHandle = TRUE;
    return &secAtts;
}

static int JimErrno(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;
}

static int JimPipe(fdtype pipefd[2])
{
    if (CreatePipe(&pipefd[0], &pipefd[1], NULL, 0)) {
        return 0;
    }
    return -1;
}

static fdtype JimDupFd(fdtype infd)
{
    fdtype dupfd;
    pidtype pid = GetCurrentProcess();

    if (DuplicateHandle(pid, infd, pid, &dupfd, 0, TRUE, DUPLICATE_SAME_ACCESS)) {
        return dupfd;
    }
    return JIM_BAD_FD;
}

static int JimRewindFd(fdtype fd)
{
    return SetFilePointer(fd, 0, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER ? -1 : 0;
}

#if 0
static int JimReadFd(fdtype fd, char *buffer, size_t len)
{
    DWORD num;

    if (ReadFile(fd, buffer, len, &num, NULL)) {
        return num;
    }
    if (GetLastError() == ERROR_HANDLE_EOF || GetLastError() == ERROR_BROKEN_PIPE) {
        return 0;
    }
    return -1;
}
#endif

static FILE *JimFdOpenForRead(fdtype fd)
{
    return _fdopen(_open_osfhandle((int)fd, _O_RDONLY | _O_TEXT), "r");
}

static fdtype JimFileno(FILE *fh)
{
    return (fdtype)_get_osfhandle(_fileno(fh));
}

static fdtype JimOpenForRead(const char *filename)
{
    return CreateFile(filename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
        JimStdSecAttrs(), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
}

static fdtype JimOpenForWrite(const char *filename, int append)
{
    fdtype fd = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
        JimStdSecAttrs(), append ? OPEN_ALWAYS : CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
    if (append && fd != JIM_BAD_FD) {
        SetFilePointer(fd, 0, NULL, FILE_END);
    }
    return fd;
}

static FILE *JimFdOpenForWrite(fdtype fd)
{
    return _fdopen(_open_osfhandle((int)fd, _O_TEXT), "w");
}

static pidtype JimWaitPid(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;
}

static HANDLE JimCreateTemp(Jim_Interp *interp, const char *contents, int len)
{
    char name[MAX_PATH];
    HANDLE handle;

    if (!GetTempPath(MAX_PATH, name) || !GetTempFileName(name, "JIM", 0, name)) {
        return JIM_BAD_FD;
    }

    handle = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, JimStdSecAttrs(),
            CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
            NULL);

    if (handle == INVALID_HANDLE_VALUE) {
        goto error;
    }

    if (contents != NULL) {

        FILE *fh = JimFdOpenForWrite(JimDupFd(handle));
        if (fh == NULL) {
            goto error;
        }

        if (fwrite(contents, len, 1, fh) != 1) {
            fclose(fh);
            goto error;
        }
        fseek(fh, 0, SEEK_SET);
        fclose(fh);
    }
    return handle;

  error:
    Jim_SetResultErrno(interp, "failed to create temp file");
    CloseHandle(handle);
    DeleteFile(name);
    return JIM_BAD_FD;
}

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
5496

5497
5498
5499
5500

5501
5502
5503
5504
5505
5506
5507
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, fdtype inputId, fdtype outputId, fdtype errorId)
JimStartWinProcess(Jim_Interp *interp, char **argv, char **env, int inputId, int outputId, int errorId)
{
    STARTUPINFO startInfo;
    PROCESS_INFORMATION procInfo;
    HANDLE hProcess, h;
    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
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
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 == JIM_BAD_FD) {
    if (inputId == -1) {
        if (CreatePipe(&startInfo.hStdInput, &h, JimStdSecAttrs(), 0) != FALSE) {
            CloseHandle(h);
        }
        inputId = _fileno(stdin);
    }
    } else {
        DuplicateHandle(hProcess, inputId, hProcess, &startInfo.hStdInput,
                0, TRUE, DUPLICATE_SAME_ACCESS);
    DuplicateHandle(hProcess, (HANDLE)_get_osfhandle(inputId), hProcess, &startInfo.hStdInput,
            0, TRUE, DUPLICATE_SAME_ACCESS);
    }
    if (startInfo.hStdInput == JIM_BAD_FD) {
    if (startInfo.hStdInput == INVALID_HANDLE_VALUE) {
        goto end;
    }

    if (outputId == JIM_BAD_FD) {
        startInfo.hStdOutput = CreateFile("NUL:", GENERIC_WRITE, 0,
    if (outputId == -1) {
        outputId = _fileno(stdout);
                JimStdSecAttrs(), OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    } else {
        DuplicateHandle(hProcess, outputId, hProcess, &startInfo.hStdOutput,
                0, TRUE, DUPLICATE_SAME_ACCESS);
    }
    DuplicateHandle(hProcess, (HANDLE)_get_osfhandle(outputId), hProcess, &startInfo.hStdOutput,
            0, TRUE, DUPLICATE_SAME_ACCESS);
    }
    if (startInfo.hStdOutput == JIM_BAD_FD) {
    if (startInfo.hStdOutput == INVALID_HANDLE_VALUE) {
        goto end;
    }


    if (errorId == JIM_BAD_FD) {

    if (errorId == -1) {
        errorId = _fileno(stderr);
    }
        startInfo.hStdError = CreateFile("NUL:", GENERIC_WRITE, 0,
                JimStdSecAttrs(), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    } else {
        DuplicateHandle(hProcess, errorId, hProcess, &startInfo.hStdError,
                0, TRUE, DUPLICATE_SAME_ACCESS);
    DuplicateHandle(hProcess, (HANDLE)_get_osfhandle(errorId), hProcess, &startInfo.hStdError,
            0, TRUE, DUPLICATE_SAME_ACCESS);
    }
    if (startInfo.hStdError == JIM_BAD_FD) {
    if (startInfo.hStdError == INVALID_HANDLE_VALUE) {
        goto end;
    }

    if (env == NULL) {

        winenv = NULL;
    }
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
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 != JIM_BAD_FD) {
    if (startInfo.hStdInput != INVALID_HANDLE_VALUE) {
        CloseHandle(startInfo.hStdInput);
    }
    if (startInfo.hStdOutput != JIM_BAD_FD) {
    if (startInfo.hStdOutput != INVALID_HANDLE_VALUE) {
        CloseHandle(startInfo.hStdOutput);
    }
    if (startInfo.hStdError != JIM_BAD_FD) {
    if (startInfo.hStdError != INVALID_HANDLE_VALUE) {
        CloseHandle(startInfo.hStdError);
    }
    return pid;
}
#else

static int JimOpenForWrite(const char *filename, int append)
{
    return open(filename, O_WRONLY | O_CREAT | (append ? O_APPEND : O_TRUNC), 0666);
}

#else
static int JimRewindFd(int fd)
{

    return lseek(fd, 0L, SEEK_SET);
}

static int JimCreateTemp(Jim_Interp *interp, const char *contents, int len)
{
    int fd = Jim_MakeTempFile(interp, NULL);

    if (fd != JIM_BAD_FD) {
        unlink(Jim_String(Jim_GetResult(interp)));
        if (contents) {
            if (write(fd, contents, len) != len) {
                Jim_SetResultErrno(interp, "couldn't write temp file");
                close(fd);
                return -1;
            }
            lseek(fd, 0L, SEEK_SET);
        }
    }
    return fd;
}

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
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
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;
    long seconds;
    jim_wide seconds;

    const char *format = "%a %b %d %H:%M:%S %Z %Y";
    struct clock_options options = { 0, "%a %b %d %H:%M:%S %Z %Y" };
    struct tm *tm;

    if (argc == 2 || (argc == 3 && !Jim_CompareStringImmediate(interp, argv[1], "-format"))) {
        return -1;
    if (Jim_GetWide(interp, argv[0], &seconds) != JIM_OK) {
        return JIM_ERR;
    }

    if (argc == 3) {
    if (argc % 2 == 0) {
        format = Jim_String(argv[2]);
        return -1;
    }

    if (parse_clock_options(interp, argc - 1, argv + 1, &options) == JIM_ERR) {
    if (Jim_GetLong(interp, argv[0], &seconds) != JIM_OK) {
        return JIM_ERR;
    }

    t = seconds;
    tm = options.gmt ? gmtime(&t) : localtime(&t);

    if (strftime(buf, sizeof(buf), format, localtime(&t)) == 0) {
        Jim_SetResultString(interp, "format string too long", -1);
    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(0);
    time_t now = time(NULL);

    struct clock_options options = { 0, NULL };
    if (!Jim_CompareStringImmediate(interp, argv[1], "-format")) {

    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]), Jim_String(argv[2]), &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, mktime(&tm));
    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
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
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[] = {
    {   "seconds",
        NULL,
        clock_cmd_seconds,
        0,
        0,

    },
    {   "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,

    },
    {   "format",
        "seconds ?-format format?",
        clock_cmd_format,
        1,
        3,

    },
#ifdef HAVE_STRPTIME
    {   "scan",
        "str -format format",
        "str -format format ?-gmt boolean?",
        clock_cmd_scan,
        3,
        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
6203

6204
6205
6206
6207
6208
6209
6210
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 += utf8_tounicode(pattern, &pchar);
                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

7798

7799
7800
7801
7802
7803
7804
7805
7806


7807
7808
7809
7810
7811




7812
7813

7814
7815
7816
7817
7818
7819
7820
7821
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 (start > end) {
    if (len < 0) {
        len = 0;
        token = Jim_Alloc(1);
        token[0] = '\0';
    }
    else {
        len = (end - start) + 1;
        token = Jim_Alloc(len + 1);
        if (pc->tt != JIM_TT_ESC) {
    token = Jim_Alloc(len + 1);
    if (pc->tt != JIM_TT_ESC) {

            memcpy(token, start, len);
            token[len] = '\0';
        }
        else {
        memcpy(token, start, len);
        token[len] = '\0';
    }
    else {

            len = JimEscape(token, start, len);
        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
8013
8014
8015
8016
8017
8018
8019
8020
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
8057
8058

8059
8060
8061
8062
8063
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
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) {

        JimPanic((objPtr->typePtr->updateStringProc == NULL, "UpdateStringProc called against '%s' type.", objPtr->typePtr->name));
        objPtr->typePtr->updateStringProc(objPtr);
        Jim_GetString(objPtr, NULL);
    }
    return objPtr->length;
}


const char *Jim_String(Jim_Obj *objPtr)
{
    if (objPtr->bytes == NULL) {

        JimPanic((objPtr->typePtr == NULL, "UpdateStringProc called against typeless value."));
        JimPanic((objPtr->typePtr->updateStringProc == NULL, "UpdateStringProc called against '%s' type.", objPtr->typePtr->name));
        objPtr->typePtr->updateStringProc(objPtr);
        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 const Jim_ObjType interpolatedObjType = {
    "interpolated",
    FreeInterpolatedInternalRep,
    NULL,
static void DupInterpolatedInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr)
{

    dupPtr->internalRep = srcPtr->internalRep;

    NULL,
    JIM_TYPE_NONE,
    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
8171

8172
8173
8174
8175
8176
8177
8178
8179
8180
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_Alloc(len + 1);
        objPtr->bytes = Jim_StrDupLen(s, len);
        memcpy(objPtr->bytes, s, len);
        objPtr->bytes[len] = '\0';
    }
    objPtr->length = len;


    objPtr->typePtr = NULL;
    return objPtr;
}
8454
8455
8456
8457
8458
8459
8460
8461
8462
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
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
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;

    SetStringFromAny(interp, strObjPtr);

    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;

    if (strObjPtr->typePtr != &stringObjType) {
        SetStringFromAny(interp, strObjPtr);
    }

    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);
    if (len == 0) {
        return strObjPtr;
    }

#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
8753
8754
8755

8756
8757
8758
8759
8760
8761
8762
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 {
        const char *objStr = Jim_String(objPtr);

        if (strcmp(str, objStr) != 0)
        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
8951

8952
8953
8954
8955
8956
8957
8958
8959
8960
8961







8962
8963
8964
8965
8966
8967
8968
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(ParseToken *t)
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
9034

9035
9036
9037
9038
9039
9040
9041
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(tokenlist->list + 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
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
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 == ' ');
    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
9264
9265
9266
9267
9268
9269
9270
9271
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
9919

9920
9921
9922
9923
9924
9925
9926

9927
9928
9929
9930
9931
9932
9933
9934
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 *nameObjPtr, *valObjPtr;
    Jim_Obj *valObjPtr;
    int result;

    nameObjPtr = Jim_NewStringObj(interp, name, -1);
    valObjPtr = Jim_NewStringObj(interp, val, -1);
    Jim_IncrRefCount(nameObjPtr);
    Jim_IncrRefCount(valObjPtr);
    result = Jim_SetVariable(interp, nameObjPtr, valObjPtr);
    result = Jim_SetVariableStr(interp, name, valObjPtr);
    Jim_DecrRefCount(interp, nameObjPtr);
    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
10240

10241
10242
10243
10244
10245
10246




10247
10248
10249
10250
10251
10252
10253
10254
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);
}

void DupDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr)
static void DupDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr)
{
    JIM_NOTUSED(interp);

    dupPtr->internalRep.dictSubstValue.varNameObjPtr =
        srcPtr->internalRep.dictSubstValue.varNameObjPtr;
    dupPtr->internalRep.dictSubstValue.indexObjPtr = srcPtr->internalRep.dictSubstValue.indexObjPtr;
    dupPtr->internalRep = srcPtr->internalRep;

    Jim_IncrRefCount(dupPtr->internalRep.dictSubstValue.varNameObjPtr);
    Jim_IncrRefCount(dupPtr->internalRep.dictSubstValue.indexObjPtr);
    dupPtr->typePtr = &dictSubstObjType;
}


static void SetDictSubstFromAny(Jim_Interp *interp, Jim_Obj *objPtr)
{
    if (objPtr->typePtr != &dictSubstObjType) {
        Jim_Obj *varObjPtr, *keyObjPtr;
10292
10293
10294
10295
10296
10297
10298
10299
10300
10301
10302


10303
10304
10305
10306
10307
10308
10309
10310
10311
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)
{
    Jim_Obj *resultObjPtr;

    if (Jim_EvalExpression(interp, objPtr, &resultObjPtr) == JIM_OK) {

    if (Jim_EvalExpression(interp, objPtr) == JIM_OK) {
        return Jim_GetResult(interp);
        resultObjPtr->refCount--;
        return resultObjPtr;
    }
    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
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
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
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
10948
10949
10950
10951
10952
10953
10954
10955
10956
10957
10958
10959
10960
10961
10962
10963
10964


10965
10966
10967
10968
10969
10970
10971
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;

    str = Jim_String(objPtr);

#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;
    }
    else
#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



11557


11558
11559
11560
11561
11562
11563
11564
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];
        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
12334

12335
12336
12337
12338
12339
12340
12341
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))
#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
12387
12388


12389
12390

12391
12392
12393
12394
12395
12396
12397
12398
12399
12400
12401
12402
12403
12404
12405
12406
12407
12408
12409
12410
12411
12412
12413
12414
12415
12416
12417
12418
12419
12420
12421
12422
12423
12424
12425
12426
12427
12428
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12445
12446
12447
12448

12449
12450
12451
12452
12453
12454
12455
12456
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
{
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_LOGICAND_LEFT,
    JIM_EXPROP_LOGICAND_RIGHT,


    JIM_EXPROP_LOGICOR,
    JIM_EXPROP_LOGICOR_LEFT,
    JIM_EXPROP_LOGICOR_RIGHT,



    JIM_EXPROP_TERNARY,
    JIM_EXPROP_TERNARY_LEFT,
    JIM_EXPROP_TERNARY_RIGHT,


    JIM_EXPROP_COLON,
    JIM_EXPROP_COLON_LEFT,
    JIM_EXPROP_COLON_RIGHT,

    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_FIRST,
    JIM_EXPROP_FUNC_INT,
    JIM_EXPROP_FUNC_INT = JIM_EXPROP_FUNC_FIRST,
    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
12479
12480
12481





12482
12483
12484


12485
12486
12487
12488
12489
12490
12491

12492
12493
12494

12495
12496
12497
12498

12499
12500
12501
12502
12503
12504
12505



12506
12507
12508
12509

12510
12511
12512

12513
12514
12515

12516




12517
12518

12519
12520
12521
12522
12523
12524
12525
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 JimExprState
{
    Jim_Obj **stack;
struct JimExprNode {
    int type;
    struct Jim_Obj *objPtr;

    struct JimExprNode *left;
    int stacklen;
    int opcode;
    int skip;
    struct JimExprNode *right;
    struct JimExprNode *ternary;
};


typedef struct Jim_ExprOperator
{
    const char *name;
    int (*funcop) (Jim_Interp *interp, struct JimExprState * e);
    int (*funcop) (Jim_Interp *interp, struct JimExprNode *opnode);
    unsigned char precedence;
    unsigned char arity;
    unsigned char lazy;
    unsigned char attr;
    unsigned char namelen;
} Jim_ExprOperator;

static void ExprPush(struct JimExprState *e, Jim_Obj *obj)
static int JimExprGetTerm(Jim_Interp *interp, struct JimExprNode *node, Jim_Obj **objPtrPtr);
{
    Jim_IncrRefCount(obj);
    e->stack[e->stacklen++] = obj;
}

static Jim_Obj *ExprPop(struct JimExprState *e)
{
static int JimExprGetTermBoolean(Jim_Interp *interp, struct JimExprNode *node);
static int JimExprEvalTermNode(Jim_Interp *interp, struct JimExprNode *node);

    return e->stack[--e->stacklen];
}

static int JimExprOpNumUnary(Jim_Interp *interp, struct JimExprState *e)
static int JimExprOpNumUnary(Jim_Interp *interp, struct JimExprNode *node)
{
    int intresult = 1;
    int rc = JIM_OK;
    int rc;
    Jim_Obj *A = ExprPop(e);
    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 (e->opcode) {
        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
12543

12544
12545
12546
12547
12548
12549
12550
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 (e->opcode) {
        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
12578

12579
12580
12581

12582
12583
12584
12585
12586
12587
12588
12589
12590
12591
12592
12593
12594
12595
12596
12597
12598

12599

12600
12601
12602
12603








12604
12605

12606
12607

12608
12609
12610
12611

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
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) {
            ExprPush(e, Jim_NewIntObj(interp, wC));
            Jim_SetResultInt(interp, wC);
        }
        else {
            ExprPush(e, Jim_NewDoubleObj(interp, dC));
            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 JimExprState *e)
static int JimExprOpIntUnary(Jim_Interp *interp, struct JimExprNode *node)
{
    jim_wide wA;
    Jim_Obj *A = ExprPop(e);
    jim_wide wA;

    int rc = Jim_GetWide(interp, A, &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 (e->opcode) {
        switch (node->type) {
            case JIM_EXPROP_BITNOT:
                ExprPush(e, Jim_NewIntObj(interp, ~wA));
                Jim_SetResultInt(interp, ~wA);
                break;
            case JIM_EXPROP_FUNC_SRAND:
                JimPrngSeed(interp, (unsigned char *)&wA, sizeof(wA));
                ExprPush(e, Jim_NewDoubleObj(interp, JimRandDouble(interp)));
                Jim_SetResult(interp, Jim_NewDoubleObj(interp, JimRandDouble(interp)));
                break;
            default:
                abort();
        }
    }

    Jim_DecrRefCount(interp, A);

    return rc;
}

static int JimExprOpNone(Jim_Interp *interp, struct JimExprState *e)
static int JimExprOpNone(Jim_Interp *interp, struct JimExprNode *node)
{
    JimPanic((e->opcode != JIM_EXPROP_FUNC_RAND, "JimExprOpNone only support rand()"));
    JimPanic((node->type != JIM_EXPROP_FUNC_RAND, "JimExprOpNone only support rand()"));

    ExprPush(e, Jim_NewDoubleObj(interp, JimRandDouble(interp)));
    Jim_SetResult(interp, Jim_NewDoubleObj(interp, JimRandDouble(interp)));

    return JIM_OK;
}

#ifdef JIM_MATH_FUNCTIONS
static int JimExprOpDoubleUnary(Jim_Interp *interp, struct JimExprState *e)
static int JimExprOpDoubleUnary(Jim_Interp *interp, struct JimExprNode *node)
{
    int rc;
    double dA, dC;
    Jim_Obj *A = ExprPop(e);
    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 (e->opcode) {
        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
12690

12691
12692
12693
12694
12695
12696
12697
12698
12699
12700

12701


12702
12703
12704
12705











12706
12707
12708
12709
12710
12711
12712

12713
12714
12715
12716
12717
12718
12719
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();
        }
        ExprPush(e, Jim_NewDoubleObj(interp, dC));
        Jim_SetResult(interp, Jim_NewDoubleObj(interp, dC));
    }

    Jim_DecrRefCount(interp, A);

    return rc;
}
#endif


static int JimExprOpIntBin(Jim_Interp *interp, struct JimExprState *e)
static int JimExprOpIntBin(Jim_Interp *interp, struct JimExprNode *node)
{
    jim_wide wA, wB;
    int rc;
    Jim_Obj *B = ExprPop(e);
    Jim_Obj *A = ExprPop(e);
    jim_wide wA, wB;
    int rc = JIM_ERR;
    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 (e->opcode) {
        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
12761

12762
12763
12764
12765
12766
12767
12768
12769
12770

12771
12772
12773
12774
12775
12776
12777
12778
12779
12780
12781
12782

12783
12784
12785
12786

12787




12788

12789


12790
12791
12792
12793
12794
12795
12796
12797

12798
12799
12800
12801
12802
12803
12804
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 (e->opcode == JIM_EXPROP_ROTR) {
                    if (node->type == JIM_EXPROP_ROTR) {
                        uB = S - uB;
                    }
                    wC = (unsigned long)(uA << uB) | (uA >> (S - uB));
                    break;
                }
            default:
                abort();
        }
        ExprPush(e, Jim_NewIntObj(interp, wC));
        Jim_SetResultInt(interp, wC);

    }

    Jim_DecrRefCount(interp, A);
    Jim_DecrRefCount(interp, B);

    return rc;
}



static int JimExprOpBin(Jim_Interp *interp, struct JimExprState *e)
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_Obj *B = ExprPop(e);
        Jim_DecrRefCount(interp, A);
    Jim_Obj *A = ExprPop(e);
        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 (e->opcode) {
        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
12854

12855
12856
12857
12858
12859
12860
12861
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 (e->opcode) {
        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
12926

12927
12928
12929
12930
12931
12932
12933
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 (e->opcode) {
        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
12954

12955
12956
12957

12958
12959
12960
12961
12962
12963
12964
12965
12966
12967
12968
12969
12970
12971
12972
12973
12974


12975

12976
12977
12978
12979
12980
12981
12982













12983
12984
12985
12986

12987
12988
12989
12990
12991
12992
12993
12994
12995
12996
12997
12998
12999

13000
13001
13002
13003
13004

13005
13006
13007
13008
13009
13010
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

13168
13169
13170
13171

13172
13173
13174
13175
13176
13177
13178
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:
    ExprPush(e, Jim_NewIntObj(interp, wC));
    Jim_SetResultInt(interp, wC);
    goto done;
doubleresult:
    ExprPush(e, Jim_NewDoubleObj(interp, dC));
    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 JimExprState *e)
static int JimExprOpStrBin(Jim_Interp *interp, struct JimExprNode *node)
{
    Jim_Obj *B = ExprPop(e);
    Jim_Obj *A = ExprPop(e);

    jim_wide wC;

    switch (e->opcode) {
    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 (e->opcode == JIM_EXPROP_STRNE) {
            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();
    }
    ExprPush(e, Jim_NewIntObj(interp, wC));
    Jim_SetResultInt(interp, wC);

    Jim_DecrRefCount(interp, A);
    Jim_DecrRefCount(interp, B);

    return JIM_OK;
    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) {
        return l != 0;
        ret = (l != 0);
    }
    if (Jim_GetDouble(interp, obj, &d) == JIM_OK) {
        return d != 0;
    else if (Jim_GetDouble(interp, obj, &d) == JIM_OK) {
        ret = (d != 0);
    }
    if (Jim_GetBoolean(interp, obj, &b) == JIM_OK) {
        return b != 0;
    else if (Jim_GetBoolean(interp, obj, &b) == JIM_OK) {
        ret = (b != 0);
    }
    return -1;
}


    Jim_DecrRefCount(interp, obj);
static int JimExprOpAndLeft(Jim_Interp *interp, struct JimExprState *e)
{
    Jim_Obj *skip = ExprPop(e);
    Jim_Obj *A = ExprPop(e);
    int rc = JIM_OK;

    return ret;
    switch (ExprBool(interp, A)) {
        case 0:

}
            e->skip = JimWideValue(skip);
            ExprPush(e, Jim_NewIntObj(interp, 0));
            break;

        case 1:

static int JimExprOpAnd(Jim_Interp *interp, struct JimExprNode *node)
            break;

{
        case -1:

            rc = JIM_ERR;
    }
    Jim_DecrRefCount(interp, A);
    Jim_DecrRefCount(interp, skip);

    return rc;
}


    int result = JimExprGetTermBoolean(interp, node->left);
static int JimExprOpOrLeft(Jim_Interp *interp, struct JimExprState *e)
{

    Jim_Obj *skip = ExprPop(e);
    Jim_Obj *A = ExprPop(e);
    int rc = JIM_OK;

    if (result == 1) {
    switch (ExprBool(interp, A)) {
        case 0:

            break;

        result = JimExprGetTermBoolean(interp, node->right);
        case 1:

    }
            e->skip = JimWideValue(skip);
            ExprPush(e, Jim_NewIntObj(interp, 1));
            break;

    if (result == -1) {
        case -1:

            rc = JIM_ERR;
        return JIM_ERR;
            break;
    }
    Jim_DecrRefCount(interp, A);
    Jim_SetResultInt(interp, result);
    Jim_DecrRefCount(interp, skip);

    return rc;
    return JIM_OK;
}

static int JimExprOpAndOrRight(Jim_Interp *interp, struct JimExprState *e)
static int JimExprOpOr(Jim_Interp *interp, struct JimExprNode *node)
{
    Jim_Obj *A = ExprPop(e);
    int rc = JIM_OK;

    switch (ExprBool(interp, A)) {
        case 0:
            ExprPush(e, Jim_NewIntObj(interp, 0));
            break;

        case 1:
            ExprPush(e, Jim_NewIntObj(interp, 1));
    int result = JimExprGetTermBoolean(interp, node->left);
            break;

        case -1:

    if (result == 0) {
            rc = JIM_ERR;
            break;
    }
    Jim_DecrRefCount(interp, A);

    return rc;
}


        result = JimExprGetTermBoolean(interp, node->right);
    }
    if (result == -1) {
        return JIM_ERR;
    }
    Jim_SetResultInt(interp, result);
static int JimExprOpTernaryLeft(Jim_Interp *interp, struct JimExprState *e)
{
    Jim_Obj *skip = ExprPop(e);
    Jim_Obj *A = ExprPop(e);
    int rc = JIM_OK;

    return JIM_OK;
}

    ExprPush(e, A);

    switch (ExprBool(interp, A)) {
        case 0:

            e->skip = JimWideValue(skip);

            ExprPush(e, Jim_NewIntObj(interp, 0));
            break;

        case 1:

            break;

static int JimExprOpTernary(Jim_Interp *interp, struct JimExprNode *node)
        case -1:

{
            rc = JIM_ERR;
            break;
    }

    Jim_DecrRefCount(interp, A);
    Jim_DecrRefCount(interp, skip);

    int result = JimExprGetTermBoolean(interp, node->left);
    return rc;
}


    if (result == 1) {
static int JimExprOpColonLeft(Jim_Interp *interp, struct JimExprState *e)
{

    Jim_Obj *skip = ExprPop(e);
    Jim_Obj *B = ExprPop(e);
    Jim_Obj *A = ExprPop(e);


        return JimExprEvalTermNode(interp, node->right);
    }
    if (ExprBool(interp, A)) {

    else if (result == 0) {
        e->skip = JimWideValue(skip);

        ExprPush(e, B);
    }

    Jim_DecrRefCount(interp, skip);
    Jim_DecrRefCount(interp, A);
    Jim_DecrRefCount(interp, B);
    return JIM_OK;
}
        return JimExprEvalTermNode(interp, node->ternary);
    }

static int JimExprOpNull(Jim_Interp *interp, struct JimExprState *e)
{
    return JIM_OK;
    return JIM_ERR;
}

enum
{
    LAZY_NONE,
    LAZY_OP,
    OP_FUNC = 0x0001,
    LAZY_LEFT,
    LAZY_RIGHT,
    RIGHT_ASSOC,
    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, LAZY_NONE)
#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
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
13248
13249
13250
13251
13252
13253
13254
13255
13256
13257
13258



















13259
13260
13261
13262

13263
13264
13265
13266
13267
13268
13269
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_ATTR("&&", 10, 2, NULL, LAZY_OP),
    OPRINIT_ATTR(NULL, 10, 2, JimExprOpAndLeft, LAZY_LEFT),
    OPRINIT("&&", 10, 2, JimExprOpAnd),
    OPRINIT_ATTR(NULL, 10, 2, JimExprOpAndOrRight, LAZY_RIGHT),

    OPRINIT_ATTR("||", 9, 2, NULL, LAZY_OP),
    OPRINIT_ATTR(NULL, 9, 2, JimExprOpOrLeft, LAZY_LEFT),
    OPRINIT("||", 9, 2, JimExprOpOr),
    OPRINIT_ATTR(NULL, 9, 2, JimExprOpAndOrRight, LAZY_RIGHT),

    OPRINIT_ATTR("?", 5, 2, JimExprOpNull, LAZY_OP),
    OPRINIT_ATTR("?", 5, 3, JimExprOpTernary, OP_RIGHT_ASSOC),
    OPRINIT_ATTR(NULL, 5, 2, JimExprOpTernaryLeft, LAZY_LEFT),
    OPRINIT_ATTR(NULL, 5, 2, JimExprOpNull, LAZY_RIGHT),

    OPRINIT_ATTR(":", 5, 2, JimExprOpNull, LAZY_OP),
    OPRINIT_ATTR(":", 5, 3, NULL, OP_RIGHT_ASSOC),
    OPRINIT_ATTR(NULL, 5, 2, JimExprOpColonLeft, LAZY_LEFT),
    OPRINIT_ATTR(NULL, 5, 2, JimExprOpNull, LAZY_RIGHT),


    OPRINIT_ATTR("**", 120, 2, JimExprOpBin, 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("!", 150, 1, JimExprOpNumUnary),
    OPRINIT("~", 150, 1, JimExprOpIntUnary),
    OPRINIT(NULL, 150, 1, JimExprOpNumUnary),
    OPRINIT(NULL, 150, 1, JimExprOpNumUnary),
    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("int", 200, 1, JimExprOpNumUnary),
    OPRINIT("wide", 200, 1, JimExprOpNumUnary),
    OPRINIT("abs", 200, 1, JimExprOpNumUnary),
    OPRINIT("double", 200, 1, JimExprOpNumUnary),
    OPRINIT("round", 200, 1, JimExprOpNumUnary),
    OPRINIT("rand", 200, 0, JimExprOpNone),
    OPRINIT("srand", 200, 1, JimExprOpIntUnary),
    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("sin", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("cos", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("tan", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("asin", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("acos", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("atan", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("atan2", 200, 2, JimExprOpBin),
    OPRINIT("sinh", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("cosh", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("tanh", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("ceil", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("floor", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("exp", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("log", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("log10", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("sqrt", 200, 1, JimExprOpDoubleUnary),
    OPRINIT("pow", 200, 2, JimExprOpBin),
    OPRINIT("hypot", 200, 2, JimExprOpBin),
    OPRINIT("fmod", 200, 2, JimExprOpBin),
    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_LAZY
#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

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
13456
13457
13458

13459
13460
13461
13462
13463
13464
13465
13466
13467
13468
13469
13470
13471
13472
13473
13474
13475
13476
13477
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 bestIdx = -1, bestLen = 0;
    int bestLen = 0;


    for (i = 0; i < (signed)JIM_EXPR_OPERATORS_NUM; i++) {
        const char * const opname = Jim_ExprOperators[i].name;
        const int oplen = Jim_ExprOperators[i].namelen;
        const struct Jim_ExprOperator *op = &Jim_ExprOperators[i];

        if (opname == NULL || opname[0] != pc->p[0]) {
        if (op->name[0] != pc->p[0]) {
            continue;
        }

        if (oplen > bestLen && strncmp(opname, pc->p, oplen) == 0) {
            bestIdx = i + JIM_TT_EXPR_OP;
            bestLen = oplen;
        if (op->namelen > bestLen && strncmp(op->name, pc->p, op->namelen) == 0) {
            bestOp = op;
            bestLen = op->namelen;
        }
    }
    if (bestIdx == -1) {
    if (bestOp == NULL) {
        return JIM_ERR;
    }


    if (bestIdx >= JIM_EXPROP_FUNC_FIRST) {
    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 = bestIdx;
    pc->tt = (bestOp - Jim_ExprOperators) + JIM_TT_EXPR_OP;
    return JIM_OK;
}

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];
}

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
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
13879
13880
13881
13882
13883
13884
13885
13886
13887
13888
13889
13890
13891
13892

13893
13894

13895
13896
13897

13898
13899
13900

13901
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
13953
13954
13955
13956
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,
};


typedef struct ExprByteCode
struct ExprTree
{
    ScriptToken *token;
    struct JimExprNode *expr;
    struct JimExprNode *nodes;
    int len;
    int inUse;
} ExprByteCode;
};

static void ExprFreeByteCode(Jim_Interp *interp, ExprByteCode * expr)
static void ExprTreeFreeNodes(Jim_Interp *interp, struct JimExprNode *nodes, int num)
{
    int i;

    for (i = 0; i < expr->len; i++) {
        Jim_DecrRefCount(interp, expr->token[i].objPtr);
    }
    Jim_Free(expr->token);
    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)
{
    ExprByteCode *expr = (void *)objPtr->internalRep.ptr;
    struct ExprTree *expr = (void *)objPtr->internalRep.ptr;

    if (expr) {
        if (--expr->inUse != 0) {
            return;
        }

        ExprFreeByteCode(interp, expr);
        ExprTreeFree(interp, expr);
    }
}

static void DupExprInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr)
{
    JIM_NOTUSED(interp);
    JIM_NOTUSED(srcPtr);


    dupPtr->typePtr = NULL;
}

static int ExprCheckCorrectness(Jim_Interp *interp, Jim_Obj *exprObjPtr, ExprByteCode * expr)
{
    int i;
    int stacklen = 0;
    int ternary = 0;
    int lasttt = JIM_TT_NONE;
    const char *errmsg;

struct ExprBuilder {
    for (i = 0; i < expr->len; i++) {
        ScriptToken *t = &expr->token[i];
        const struct Jim_ExprOperator *op = JimExprOperatorInfoByOpcode(t->type);
        lasttt = t->type;

        stacklen -= op->arity;

        if (stacklen < 0) {
            break;
        }
        if (t->type == JIM_EXPROP_TERNARY || t->type == JIM_EXPROP_TERNARY_LEFT) {
            ternary++;
        }
        else if (t->type == JIM_EXPROP_COLON || t->type == JIM_EXPROP_COLON_LEFT) {
            ternary--;
        }


        stacklen++;
    }
    if (stacklen == 1 && ternary == 0) {
        return JIM_OK;
    }

    if (stacklen <= 0) {

        if (lasttt >= JIM_EXPROP_FUNC_FIRST) {
            errmsg = "too few arguments for math function";
            Jim_SetResultString(interp, "too few arguments for math function", -1);
        } else {
            errmsg = "premature end of expression";
        }
    }
    else if (stacklen > 1) {
        if (lasttt >= JIM_EXPROP_FUNC_FIRST) {
            errmsg = "too many arguments for math function";
        } else {
            errmsg = "extra tokens at end of expression";
        }
    }
    else {
        errmsg = "invalid ternary expression";
    }
    Jim_SetResultFormatted(interp, "syntax error in expression \"%#s\": %s", exprObjPtr, errmsg);
    return JIM_ERR;
}

static int ExprAddLazyOperator(Jim_Interp *interp, ExprByteCode * expr, ParseToken *t)
{
    int i;
    int parencount;

    int leftindex, arity, offset;


    leftindex = expr->len - 1;

    arity = 1;
    while (arity) {
        ScriptToken *tt = &expr->token[leftindex];

        if (tt->type >= JIM_TT_EXPR_OP) {
            arity += JimExprOperatorInfoByOpcode(tt->type)->arity;
        }
        arity--;
        if (--leftindex < 0) {
            return JIM_ERR;
        }
    }
    leftindex++;


    memmove(&expr->token[leftindex + 2], &expr->token[leftindex],
        sizeof(*expr->token) * (expr->len - leftindex));
    expr->len += 2;
    offset = (expr->len - leftindex) - 1;

    expr->token[leftindex + 1].type = t->type + 1;
    expr->token[leftindex + 1].objPtr = interp->emptyObj;

    expr->token[leftindex].type = JIM_TT_EXPR_INT;
    expr->token[leftindex].objPtr = Jim_NewIntObj(interp, offset);


    expr->token[expr->len].objPtr = interp->emptyObj;
    expr->token[expr->len].type = t->type + 2;
    expr->len++;


    for (i = leftindex - 1; i > 0; i--) {
        const struct Jim_ExprOperator *op = JimExprOperatorInfoByOpcode(expr->token[i].type);
        if (op->lazy == LAZY_LEFT) {
            if (JimWideValue(expr->token[i - 1].objPtr) + i - 1 >= leftindex) {
                JimWideValue(expr->token[i - 1].objPtr) += 2;
            }
        }
    }
    return JIM_OK;
}

static int ExprAddOperator(Jim_Interp *interp, ExprByteCode * expr, ParseToken *t)
{
    struct ScriptToken *token = &expr->token[expr->len];
    const struct Jim_ExprOperator *op = JimExprOperatorInfoByOpcode(t->type);

    if (op->lazy == LAZY_OP) {
        if (ExprAddLazyOperator(interp, expr, t) != JIM_OK) {
            Jim_SetResultFormatted(interp, "Expression has bad operands to %s", op->name);
            return JIM_ERR;
        }
    }
    else {
        token->objPtr = interp->emptyObj;
        token->type = t->type;
        expr->len++;
    }
    return JIM_OK;
}

static int ExprTernaryGetColonLeftIndex(ExprByteCode *expr, int right_index)
{
    int ternary_count = 1;

    right_index--;

    while (right_index > 1) {
        if (expr->token[right_index].type == JIM_EXPROP_TERNARY_LEFT) {
            ternary_count--;
        }
        else if (expr->token[right_index].type == JIM_EXPROP_COLON_RIGHT) {
            ternary_count++;
        }
        else if (expr->token[right_index].type == JIM_EXPROP_COLON_LEFT && ternary_count == 1) {
            return right_index;
        }
        right_index--;
    }


    return -1;
}

static int ExprTernaryGetMoveIndices(ExprByteCode *expr, int right_index, int *prev_right_index, int *prev_left_index)
{
    int i = right_index - 1;
    int ternary_count = 1;

    while (i > 1) {
        if (expr->token[i].type == JIM_EXPROP_TERNARY_LEFT) {
            if (--ternary_count == 0 && expr->token[i - 2].type == JIM_EXPROP_COLON_RIGHT) {
                *prev_right_index = i - 2;
                *prev_left_index = ExprTernaryGetColonLeftIndex(expr, *prev_right_index);
                return 1;
            }
        }
        else if (expr->token[i].type == JIM_EXPROP_COLON_RIGHT) {
            if (ternary_count == 0) {
                return 0;
            }
            ternary_count++;
        }
        i--;
    }
    return 0;
}

static void ExprTernaryReorderExpression(Jim_Interp *interp, ExprByteCode *expr)
{
    int i;
    int level;

    for (i = expr->len - 1; i > 1; i--) {
        int prev_right_index;
        int prev_left_index;
        int j;
        ScriptToken tmp;

    ParseToken *token;
    ParseToken *first_token;
        if (expr->token[i].type != JIM_EXPROP_COLON_RIGHT) {
            continue;
        }


        if (ExprTernaryGetMoveIndices(expr, i, &prev_right_index, &prev_left_index) == 0) {
            continue;
        }

        tmp = expr->token[prev_right_index];
        for (j = prev_right_index; j < i; j++) {
            expr->token[j] = expr->token[j + 1];
        }
        expr->token[i] = tmp;

        JimWideValue(expr->token[prev_left_index-1].objPtr) += (i - prev_right_index);


        i++;
    }
}

static ExprByteCode *ExprCreateByteCode(Jim_Interp *interp, const ParseTokenList *tokenlist, Jim_Obj *exprObjPtr, Jim_Obj *fileNameObj)
{
    Jim_Stack stack;
    ExprByteCode *expr;
    int ok = 1;
    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++) {
    int prevtt = JIM_TT_NONE;
    int have_ternary = 0;


        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);
        }
    }
    int count = tokenlist->count - 1;

    expr = Jim_Alloc(sizeof(*expr));
    expr->inUse = 1;
    expr->len = 0;
    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;
    Jim_InitStack(&stack);

    for (i = 0; i < tokenlist->count; i++) {
        ParseToken *t = &tokenlist->list[i];
        const struct Jim_ExprOperator *op = JimExprOperatorInfoByOpcode(t->type);

        if (op->lazy == LAZY_OP) {
            count += 2;

    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;
            }

        }
            if (t->type == JIM_EXPROP_TERNARY) {
                have_ternary = 1;
            }
        }
    }

    expr->token = Jim_Alloc(sizeof(ScriptToken) * count);

    for (i = 0; i < tokenlist->count && ok; i++) {
        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 {

        ParseToken *t = &tokenlist->list[i];


        struct ScriptToken *token = &expr->token[expr->len];

        if (t->type == JIM_TT_EOL) {
            break;
        }

        if (TOKEN_IS_EXPR_OP(t->type)) {
                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;
            ParseToken *tt;


            if (prevtt == JIM_TT_NONE || prevtt == JIM_TT_SUBEXPR_START || prevtt == JIM_TT_SUBEXPR_COMMA || prevtt >= JIM_TT_EXPR_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)) {

            while ((tt = Jim_StackPeek(&stack)) != NULL) {
                const struct Jim_ExprOperator *tt_op =
                    JimExprOperatorInfoByOpcode(tt->type);

                builder->token--;
                break;
            }

                if (op->arity != 1 && tt_op->precedence >= op->precedence) {

                    if (tt_op->precedence == op->precedence && tt_op->lazy == RIGHT_ASSOC) {
                        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;
                    }
                    if (ExprAddOperator(interp, expr, tt) != JIM_OK) {
                        ok = 0;
                        goto err;
                    }
                    Jim_StackPop(&stack);
                }
                    builder->token++;
                    goto noargs;
                }
                builder->parencount++;


                else {
                    break;
                }
            }
                rc = ExprTreeBuildTree(interp, builder, 0, EXPR_FUNC_ARGS | EXPR_UNTIL_CLOSE, op->arity);
            }
            else if (t->type == JIM_EXPROP_TERNARY) {

            Jim_StackPush(&stack, t);
        }
        else if (t->type == JIM_TT_SUBEXPR_START) {
                rc = ExprTreeBuildTree(interp, builder, op->precedence, EXPR_TERNARY, 2);
            }
            else {
            Jim_StackPush(&stack, t);
        }
        else if (t->type == JIM_TT_SUBEXPR_END || t->type == JIM_TT_SUBEXPR_COMMA) {

            ok = 0;
            while (Jim_StackLen(&stack)) {
                ParseToken *tt = Jim_StackPop(&stack);

                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 (tt->type == JIM_TT_SUBEXPR_START || tt->type == JIM_TT_SUBEXPR_COMMA) {
                    if (t->type == JIM_TT_SUBEXPR_COMMA) {

                        Jim_StackPush(&stack, tt);
                    }
            }
            if (op->arity >= 2) {
                node->right = Jim_StackPop(&builder->stack);
                if (node->right == NULL) {
                    goto missingoperand;
                }
                    ok = 1;
                    break;
                }
                if (ExprAddOperator(interp, expr, tt) != JIM_OK) {
                    goto err;
            }
            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;

                }
            }
            if (!ok) {

                Jim_SetResultFormatted(interp, "Unexpected close parenthesis in expression: \"%#s\"", exprObjPtr);
                goto err;
            }

            Jim_StackPush(&builder->stack, node);
        }
        else {
            Jim_Obj *objPtr = NULL;


            token->type = t->type;


            if (!TOKEN_IS_EXPR_START(prevtt) && !TOKEN_IS_EXPR_OP(prevtt)) {
                Jim_SetResultFormatted(interp, "missing operator in expression: \"%#s\"", exprObjPtr);
                ok = 0;
                Jim_SetResultFormatted(interp, "missing operator in expression: \"%#s\"", builder->exprObjPtr);
                return JIM_ERR;
                goto 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) {
            if (!objPtr) {
                token->objPtr = objPtr;
            }

            else {

                token->objPtr = Jim_NewStringObj(interp, t->token, t->len);
                objPtr = Jim_NewStringObj(interp, t->token, t->len);
                if (t->type == JIM_TT_CMD) {

                    JimSetSourceInfo(interp, token->objPtr, fileNameObj, t->line);
                    JimSetSourceInfo(interp, objPtr, builder->fileNameObj, t->line);
                }
            }
            expr->len++;
        }
        prevtt = t->type;
    }



            node = builder->next++;
            node->objPtr = objPtr;
            Jim_IncrRefCount(node->objPtr);
            node->type = t->type;
            Jim_StackPush(&builder->stack, node);
        }
    }

    while (Jim_StackLen(&stack)) {
        ParseToken *tt = Jim_StackPop(&stack);

        if (tt->type == JIM_TT_SUBEXPR_START) {
            ok = 0;
            Jim_SetResultString(interp, "Missing close parenthesis", -1);
            goto err;
        }
        if (ExprAddOperator(interp, expr, tt) != JIM_OK) {
            ok = 0;
            goto err;
        }
    }
    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);

    if (have_ternary) {
        ExprTernaryReorderExpression(interp, expr);
    }
    rc = ExprTreeBuildTree(interp, &builder, 0, 0, 1);

    if (rc == JIM_OK) {
        top = Jim_StackPop(&builder.stack);

  err:

        if (builder.parencount) {
            Jim_SetResultString(interp, "missing close parenthesis", -1);
            rc = JIM_ERR;
        }
    Jim_FreeStack(&stack);

    for (i = 0; i < expr->len; i++) {
    }

        Jim_IncrRefCount(expr->token[i].objPtr);
    }

    Jim_FreeStack(&builder.stack);

    if (!ok) {
        ExprFreeByteCode(interp, expr);
    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;
    return expr;
}


    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 ExprByteCode *expr;
    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
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
14094
14095
14096
14097
14098
14099


14100
14101
14102

14103
14104
14105
14106
14107
14108
14109
14110

14111
14112

14113
14114
14115
14116
14117

14118
14119
14120
14121
14122
14123
14124
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 = ExprCreateByteCode(interp, &tokenlist, objPtr, fileNameObj);
    expr = ExprTreeCreateTree(interp, &tokenlist, objPtr, fileNameObj);


    ScriptTokenListFree(&tokenlist);

    if (!expr) {
        goto err;
    }

#ifdef DEBUG_SHOW_EXPR
    {
        int i;

        printf("==== Expr ====\n");
    printf("==== Expr ====\n");
        for (i = 0; i < expr->len; i++) {
            ScriptToken *t = &expr->token[i];

    JimShowExprNode(expr->expr, 0);
            printf("[%2d] %s '%s'\n", i, jim_tt_name(t->type), Jim_String(t->objPtr));
        }
    }
#endif


    if (ExprCheckCorrectness(interp, objPtr, expr) != JIM_OK) {

        ExprFreeByteCode(interp, expr);
        expr = NULL;
        goto err;
    }

    rc = JIM_OK;

  err:

    Jim_DecrRefCount(interp, fileNameObj);
    Jim_FreeIntRep(interp, objPtr);
    Jim_SetIntRepPtr(objPtr, expr);
    objPtr->typePtr = &exprObjType;
    return rc;
}

static ExprByteCode *JimGetExpression(Jim_Interp *interp, Jim_Obj *objPtr)
static struct ExprTree *JimGetExpression(Jim_Interp *interp, Jim_Obj *objPtr)
{
    if (objPtr->typePtr != &exprObjType) {
        if (SetExprFromAny(interp, objPtr) != JIM_OK) {
            return NULL;
        }
    }
    return (ExprByteCode *) Jim_GetIntRepPtr(objPtr);
    return (struct ExprTree *) Jim_GetIntRepPtr(objPtr);
}

#ifdef JIM_OPTIMIZATION
static Jim_Obj *JimExprIntValOrVar(Jim_Interp *interp, const ScriptToken *token)
static Jim_Obj *JimExprIntValOrVar(Jim_Interp *interp, struct JimExprNode *node)
{
    if (token->type == JIM_TT_EXPR_INT)
        return token->objPtr;
    else if (token->type == JIM_TT_VAR)
        return Jim_GetVariable(interp, token->objPtr, JIM_NONE);
    else if (token->type == JIM_TT_DICTSUGAR)
        return JimExpandDictSugar(interp, token->objPtr);
    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

#define JIM_EE_STATICSTACK_LEN 10

int Jim_EvalExpression(Jim_Interp *interp, Jim_Obj *exprObjPtr, Jim_Obj **exprResultPtrPtr)
{
    ExprByteCode *expr;
    Jim_Obj *staticStack[JIM_EE_STATICSTACK_LEN];
    int i;

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;
    struct JimExprState e;

    expr = JimGetExpression(interp, exprObjPtr);
    if (!expr) {
        return JIM_ERR;
    }

#ifdef JIM_OPTIMIZATION
    {
        Jim_Obj *objPtr;


        switch (expr->len) {
            case 1:
                objPtr = JimExprIntValOrVar(interp, &expr->token[0]);
                objPtr = JimExprIntValOrVar(interp, expr->expr);
                if (objPtr) {
                    Jim_IncrRefCount(objPtr);
                    Jim_SetResult(interp, objPtr);
                    *exprResultPtrPtr = objPtr;
                    return JIM_OK;
                }
                break;

            case 2:
                if (expr->token[1].type == JIM_EXPROP_NOT) {
                    objPtr = JimExprIntValOrVar(interp, &expr->token[0]);
                if (expr->expr->type == JIM_EXPROP_NOT) {
                    objPtr = JimExprIntValOrVar(interp, expr->expr->left);

                    if (objPtr && JimIsWide(objPtr)) {
                        *exprResultPtrPtr = JimWideValue(objPtr) ? interp->falseObj : interp->trueObj;
                        Jim_SetResult(interp, JimWideValue(objPtr) ? interp->falseObj : interp->trueObj);
                        Jim_IncrRefCount(*exprResultPtrPtr);
                        return JIM_OK;
                    }
                }
                break;

            case 3:
                objPtr = JimExprIntValOrVar(interp, &expr->token[0]);
                objPtr = JimExprIntValOrVar(interp, expr->expr->left);
                if (objPtr && JimIsWide(objPtr)) {
                    Jim_Obj *objPtr2 = JimExprIntValOrVar(interp, &expr->token[1]);
                    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->token[2].type) {
                        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
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
14164
14165
14166
14167
14168
14169
14170
14171
14172
14173
14174
14175
14176
14177
14178
14179
14180


14181
14182
14183
14184
14185
14186
14187
14188
14189
14190
14191
14192
14193
14194
14195
14196
14197
14198
14199
14200
14201
14202
14203
14204
14205
14206
14207
14208
14209
14210
14211
14212
14213
14214
14215
14216
14217
14218
14219
14220
14221
14222
14223
14224
14225
14226
14227
14228
14229
14230
14231
14232
14233
14234
14235
14236
14237
14238

14239
14240
14241
14242
14243
14244
14245

14246
14247

14248
14249
14250
14251
14252
14253

14254
14255
14256
14257



14258
14259

14260
14261
14262
14263
14264







14265
14266

14267
14268

14269
14270
14271
14272
14273
14274
14275
14276
14277


14278
14279
14280
14281
14282
14283
14284
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;
                        }
                        *exprResultPtrPtr = cmpRes ? interp->trueObj : interp->falseObj;
                        Jim_SetResult(interp, cmpRes ? interp->trueObj : interp->falseObj);
                        Jim_IncrRefCount(*exprResultPtrPtr);
                        return JIM_OK;
                    }
                }
                break;
        }
    }
noopt:
#endif

    expr->inUse++;



    if (expr->len > JIM_EE_STATICSTACK_LEN)
        e.stack = Jim_Alloc(sizeof(Jim_Obj *) * expr->len);
    else
        e.stack = staticStack;

    e.stacklen = 0;


    for (i = 0; i < expr->len && retcode == JIM_OK; i++) {
        Jim_Obj *objPtr;

        switch (expr->token[i].type) {
            case JIM_TT_EXPR_INT:
            case JIM_TT_EXPR_DOUBLE:
            case JIM_TT_EXPR_BOOLEAN:
            case JIM_TT_STR:
                ExprPush(&e, expr->token[i].objPtr);
                break;

            case JIM_TT_VAR:
                objPtr = Jim_GetVariable(interp, expr->token[i].objPtr, JIM_ERRMSG);
                if (objPtr) {
                    ExprPush(&e, objPtr);
                }
                else {
                    retcode = JIM_ERR;
                }
    retcode = JimExprEvalTermNode(interp, expr->expr);

                break;

            case JIM_TT_DICTSUGAR:
                objPtr = JimExpandDictSugar(interp, expr->token[i].objPtr);
                if (objPtr) {
                    ExprPush(&e, objPtr);
                }
                else {
                    retcode = JIM_ERR;
                }
                break;

            case JIM_TT_ESC:
                retcode = Jim_SubstObj(interp, expr->token[i].objPtr, &objPtr, JIM_NONE);
                if (retcode == JIM_OK) {
                    ExprPush(&e, objPtr);
                }
                break;

            case JIM_TT_CMD:
                retcode = Jim_EvalObj(interp, expr->token[i].objPtr);
                if (retcode == JIM_OK) {
                    ExprPush(&e, Jim_GetResult(interp));
                }
                break;

            default:{

                    e.skip = 0;
                    e.opcode = expr->token[i].type;

                    retcode = JimExprOperatorInfoByOpcode(e.opcode)->funcop(interp, &e);

                    i += e.skip;
                    continue;
                }
        }
    }

    expr->inUse--;

    if (retcode == JIM_OK) {
        *exprResultPtrPtr = ExprPop(&e);
    }
    else {
        for (i = 0; i < e.stacklen; i++) {
            Jim_DecrRefCount(interp, e.stack[i]);
        }
    }
    if (e.stack != staticStack) {
        Jim_Free(e.stack);
    }
    return retcode;
}

int Jim_GetBoolFromExpr(Jim_Interp *interp, Jim_Obj *exprObjPtr, int *boolPtr)
{
    int retcode;
    int retcode = Jim_EvalExpression(interp, exprObjPtr);
    jim_wide wideValue;
    double doubleValue;
    int booleanValue;
    Jim_Obj *exprResultPtr;

    retcode = Jim_EvalExpression(interp, exprObjPtr, &exprResultPtr);
    if (retcode != JIM_OK)
    if (retcode == JIM_OK) {
        return retcode;

        switch (ExprBool(interp, Jim_GetResult(interp))) {
    if (JimGetWideNoErr(interp, exprResultPtr, &wideValue) != JIM_OK) {
        if (Jim_GetDouble(interp, exprResultPtr, &doubleValue) != JIM_OK) {
            if (Jim_GetBoolean(interp, exprResultPtr, &booleanValue) != JIM_OK) {
                Jim_DecrRefCount(interp, exprResultPtr);
                return JIM_ERR;
            } else {
            case 0:
                Jim_DecrRefCount(interp, exprResultPtr);
                *boolPtr = booleanValue;
                return JIM_OK;
            }
                *boolPtr = 0;
                break;

        }
        else {
            case 1:
            Jim_DecrRefCount(interp, exprResultPtr);
            *boolPtr = doubleValue != 0;
            return JIM_OK;
        }
    }
                *boolPtr = 1;
                break;

            case -1:
                retcode = JIM_ERR;
                break;
        }
    *boolPtr = wideValue != 0;

    }
    Jim_DecrRefCount(interp, exprResultPtr);
    return JIM_OK;
    return retcode;
}




typedef struct ScanFmtPartDescr
{
    char *arg;
    char *prefix;
    const char *arg;
    const char *prefix;
    size_t width;
    int pos;
    char type;
    char modifier;
} ScanFmtPartDescr;


14332
14333
14334
14335
14336
14337
14338
14339
14340


14341
14342
14343
14344
14345
14346
14347
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 = objPtr->bytes;
    int maxFmtLen = objPtr->length;
    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
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
14476

14477





14478
14479
14480
14481
14482
14483
14484
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 (strchr("hlL", *fmt) != 0)
            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
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
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
15088


15089
15090
15091
15092
15093
15094
15095
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) {
        Jim_DecrRefCount(interp, intv[0]);

        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
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
15831

15832
15833
15834
15835
15836
15837
15838
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) {
    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
16071





16072

16073
16074
16075
16076
16077
16078
16079
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
        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
16224

16225
16226
16227
16228
16229
16230
16231
16232
16233
16234
16235
16236
16237
16238

16239
16240
16241
16242
16243
16244

16245
16246
16247

16248
16249
16250
16251
16252








16253
16254
16255
16256
16257
16258
16259
16260

16261
16262
16263
16264
16265
16266


16267
16268
16269
16270
16271

16272
16273
16274
16275
16276
16277
16278

16279
16280
16281
16282
16283
16284
16285
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;
        ExprByteCode *expr;
        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 ||
        if (incrScript->token[1].type != JIM_TT_ESC) {
            expr->token[0].type != JIM_TT_VAR ||
            (expr->token[1].type != JIM_TT_EXPR_INT && expr->token[1].type != JIM_TT_VAR)) {
            goto evalstart;
        }

        if (expr->token[2].type == JIM_EXPROP_LT) {
        if (expr->expr->type == JIM_EXPROP_LT) {
            cmpOffset = 0;
        }
        else if (expr->token[2].type == JIM_EXPROP_LTE) {
        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->token[0].objPtr)) {
        if (!Jim_StringEqObj(incrScript->token[2].objPtr, expr->expr->left->objPtr)) {
            goto evalstart;
        }


        if (expr->token[1].type == JIM_TT_EXPR_INT) {
            if (Jim_GetWide(interp, expr->token[1].objPtr, &stop) == JIM_ERR) {
        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->token[1].objPtr;
            stopVarNamePtr = expr->expr->right->objPtr;
            Jim_IncrRefCount(stopVarNamePtr);

            stop = 0;
        }


        varNamePtr = expr->token[0].objPtr;
        varNamePtr = expr->expr->left->objPtr;
        Jim_IncrRefCount(varNamePtr);

        objPtr = Jim_GetVariable(interp, varNamePtr, JIM_NONE);
        if (objPtr == NULL || Jim_GetWide(interp, objPtr, &currentVal) != JIM_OK) {
            goto testcond;
        }

16478
16479
16480
16481
16482
16483
16484
16485

16486
16487
16488
16489
16490
16491
16492
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);
        return result;
        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
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
16674
16675
16676
16677
16678
16679

16680
16681
16682


16683
16684
16685
16686
16687
16688
16689
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;
}

enum
{ SWITCH_EXACT, SWITCH_GLOB, SWITCH_RE, SWITCH_CMD };


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 = 0, *const *caseList = 0, *strObj;
    Jim_Obj *script = 0;
    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
16723
16724
16725

16726
16727
16728
16729

16730
16731
16732

16733
16734
16735
16736
16737
16738
16739
16740

16741
16742
16743
16744

16745
16746
16747
16748
16749
16750
16751
16752
16753
16754
16755

16756
16757
16758
16759
16760
16761
16762
16763

16764
16765
16766
16767
16768
16769

16770
16771
16772
16773
16774



16775
16776
16777
16778
16779
16780


16781
16782
16783
16784
16785
16786
16787
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) {
        Jim_Obj **vector;

        JimListGetElements(interp, argv[opt], &patCount, &vector);
        JimListGetElements(interp, argv[opt], &patCount, &caseList);
        caseList = vector;
    }
    else
        caseList = &argv[opt];
        caseList = (Jim_Obj **)&argv[opt];
    if (patCount == 0 || patCount % 2 != 0)
        goto wrongnumargs;
    for (i = 0; script == 0 && i < patCount; i += 2) {
    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))
                        script = caseList[i + 1];
                        scriptObj = caseList[i + 1];
                    break;
                case SWITCH_GLOB:
                    if (Jim_StringMatchObj(interp, patObj, strObj, 0))
                        script = caseList[i + 1];
                        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) {
                            Jim_Obj **vector;

                            JimListGetElements(interp, argv[opt], &patCount, &vector);
                            JimListGetElements(interp, argv[opt], &patCount, &caseList);
                            caseList = vector;
                        }

                        if (rc < 0) {
                            return -rc;
                        }
                        if (rc)
                            script = caseList[i + 1];
                            scriptObj = caseList[i + 1];
                        break;
                    }
            }
        }
        else {
            script = caseList[i + 1];
            scriptObj = caseList[i + 1];
        }
    }
    for (; i < patCount && Jim_CompareStringImmediate(interp, script, "-"); i += 2)
        script = caseList[i + 1];
    if (script && Jim_CompareStringImmediate(interp, script, "-")) {
    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 (script) {
        return Jim_EvalObj(interp, script);
    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
17079
17080

17081
17082
17083
17084
17085

17086
17087
17088
17089
17090
17091
17092
17093
17094
17095
17096
17097
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) {
    if (first > len) {

    }
    else if (len == 0) {

        first = 0;
        first = len;
    }
    else {
        Jim_SetResultString(interp, "list doesn't contain element ", -1);
        Jim_AppendObj(interp, Jim_GetResult(interp), argv[2]);
        return JIM_ERR;
    }


    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
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


17199

17200
17201
17202
17203
17204

17205
17206
17207
17208
17209
17210
17211
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, argv[argc - 1]);
        resObj = Jim_DuplicateObj(interp, resObj);
    retCode = ListSortElements(interp, resObj, &info);
    if (retCode == JIM_OK) {
        Jim_SetResult(interp, resObj);
    }
    else {
    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
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
17332
17333
17334
17335
17336

17337
17338
17339
17340
17341
17342
17343

17344
17345
17346
17347
17348
17349
17350
17351
17352
17353
17354
17355
17356
17357
17358
17359
17360
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)
{
    Jim_Obj *exprResultPtr;
    int retcode;

    if (argc == 2) {
        retcode = Jim_EvalExpression(interp, argv[1], &exprResultPtr);
        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, &exprResultPtr);
        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;
    Jim_SetResult(interp, exprResultPtr);
    Jim_DecrRefCount(interp, exprResultPtr);
    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









19666

19667
19668
19669
19670
19671
19672
19673
19674


19675
19676
19677
19678
19679
19680
19681
19682
19683
19684
19685
19686
19687
19688
19689
19690
19691








19692
19693
19694
19695
19696
19697
19698
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;
        }
    }

    const char *arg = Jim_GetString(objPtr, &arglen);
    arg = Jim_GetString(objPtr, &arglen);

    *indexPtr = -1;

    for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; entryPtr++, i++) {
        if (Jim_CompareStringImmediate(interp, objPtr, *entryPtr)) {

            *indexPtr = i;
            return JIM_OK;
            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
19823
19824
19825

19826
19827
19828
19829
19830
19831
19832
19833
19834

19835
19836
19837
19838
19839
19840
19841
19842
19843
19844
19845
19846
19847
19848
19849
19850
19851
19852
19853
19854








19855
19856
19857
19858
19859
19860
19861
19862
19863
19864
19865
19866
19867
19868
19869
19870
19871

19872
19873

19874
19875
19876
19877
19878








19879
19880
19881
19882
19883
19884
19885
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_SetResult(interp, Jim_NewEmptyStringObj(interp));
    Jim_AppendStrings(interp, Jim_GetResult(interp), Jim_String(cmd), ", ", type,
        " command \"", Jim_String(subcmd), "\": should be ", NULL);
    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_SetResult(interp, Jim_NewEmptyStringObj(interp));
    Jim_AppendStrings(interp, Jim_GetResult(interp), "Usage: \"", Jim_String(argv[0]),
        " command ... \", where command is one of: ", NULL);
    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;
    const char *cmdname;
    int help = 0;

    cmdname = Jim_String(argv[0]);

    if (argc < 2) {
        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
        Jim_AppendStrings(interp, Jim_GetResult(interp), "wrong # args: should be \"", cmdname,
        Jim_SetResultFormatted(interp, "wrong # args: should be \"%#s command ...\"\n"
            " command ...\"\n", NULL);
        Jim_AppendStrings(interp, Jim_GetResult(interp), "Use \"", cmdname, " -help ?command?\" for help", NULL);
            "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
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

20138

20139
20140
20141
20142
20143
20144
20145
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);
        } 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
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
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
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
20941
20942
20943
20944
20945
20946
20947
20948
20949
20950



20951
20952
20953
20954
20955
20956
20957



20958
20959
20960
20961
20962
20963
20964
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:",
					};
					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 i;

					for (i = 0; i < CC_NUM; i++) {
						n = strlen(character_class[i]);
						if (strncmp(pattern, character_class[i], n) == 0) {
					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 (i != CC_NUM) {
						switch (i) {
					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
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





21947

21948
21949












21950




21951
21952
21953
21954
21955
21956
21957
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(const char *prompt)
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);
    }

    return linenoise(prompt);
    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
21994

21995
21996
21997
21998
21999
22000
22001
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
    mask = umask(mask);
    umask(mask);
#endif
#endif
}

void Jim_HistoryShow(void)
{
#ifdef USE_LINENOISE
22011
22012
22013
22014
22015
22016
22017
22018

22019
22020
22021
22022
22023
22024
22025
22026
22027
22028
22029
22030
22031
22032
22033
22034
22035
22036
22037
22038









22039




















22040
22041
22042
22043
22044
22045
22046
22047
22048
22049
22050
22051
22052
22053
22054
22055
22056
22057
22058

22059
22060
22061
22062
22063
22064
22065
22066
22067
22068
22069
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;
};

void JimCompletionCallback(const char *prefix, linenoiseCompletions *comp, void *userdata)
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;
    struct JimCompletionInfo compinfo;

    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);
    }

    compinfo.interp = interp;
    compinfo.command = Jim_NewStringObj(interp, "tcl::autocomplete", -1);
    Jim_HistorySetCompletion(interp, Jim_NewStringObj(interp, "tcl::autocomplete", -1));
    Jim_IncrRefCount(compinfo.command);


    linenoiseSetCompletionCallback(JimCompletionCallback, &compinfo);
#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
22095

22096
22097
22098
22099
22100
22101
22102
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(prompt);
            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
22145
22146
22147
22148
22149
22150
22151
22152
22153
22154
22155
22156
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);

#ifdef USE_LINENOISE
    Jim_DecrRefCount(interp, compinfo.command);
    linenoiseSetCompletionCallback(NULL, NULL);
#endif

    return retcode;
}

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Deleted autosetup/markdown-formatting.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68




































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2010 WorkWare Systems http://www.workware.net.au/
# All rights reserved

# Module which provides text formatting
# markdown format (kramdown syntax)

use formatting

proc para {text} {
    regsub -all "\[ \t\n\]+" [string trim $text] " " text
    regsub -all {([^a-zA-Z])'([^']*)'} $text {\1**`\2`**} text
    regsub -all {^'([^']*)'} $text {**`\1`**} text
    regsub -all {(http[^ \t\n]*)} $text {[\1](\1)} text
    return $text
}
proc title {text} {
    underline [para $text] =
    nl
}
proc p {text} {
    puts [para $text]
    nl
}
proc codelines {lines} {
    puts "~~~~~~~~~~~~"
    foreach line $lines {
        puts $line
    }
    puts "~~~~~~~~~~~~"
    nl
}
proc code {text} {
    puts "~~~~~~~~~~~~"
    foreach line [parse_code_block $text] {
        puts $line
    }
    puts "~~~~~~~~~~~~"
    nl
}
proc nl {} {
    puts ""
}
proc underline {text char} {
    regexp "^(\[ \t\]*)(.*)" $text -> indent words
    puts $text
    puts $indent[string repeat $char [string length $words]]
}
proc section {text} {
    underline "[para $text]" -
    nl
}
proc subsection {text} {
    puts "### `$text`"
    nl
}
proc bullet {text} {
    puts "* [para $text]"
}
proc defn {first args} {
    puts "^"
    set defn [string trim [join $args \n]]
    if {$first ne ""} {
        puts "**${first}**"
        puts -nonewline ": "
        regsub -all "\n\n" $defn "\n: " defn
    }
    puts "$defn"
}
Deleted autosetup/migrate-autoconf.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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














































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#!/bin/sh
# Copyright (c) 2011 WorkWare Systems http://www.workware.net.au/
# All rights reserved
# vim:se syntax=tcl:
# \
dir=`dirname "$0"`; exec "`$dir/find-tclsh`" "$0" "$@"

# Migrates configure.in or configure.ac to auto.def

proc dputs {msg} {
	# Uncomment this for debugging
	#puts $msg
}
proc make-quoted-string {str} {
	return \"[string map {\" \\" \[ \\[ \] \\]} $str]\"
}

# Remove white space and trailing backslash
proc clean-arg {str} {
	set str [string trim $str]
	if {[string index $str end] eq "\\"} {
		set str [string trim [string range $str 0 end-1]]
	}
	return $str
}

# Parse m4 macro args into a list, removing brackets
proc split-comma-args {str} {
	#dputs "split-comma-args $str"
	set args {}
	# Step one char at a time and keep track of if we are in a bracketed expression
	set inbracket 0
	set inparen 0
	foreach c [split $str {}] {
		if {!$inbracket} {
			if {$inparen} {
				if {$c eq ")"} {
					incr inparen -1
				}
			} elseif {$c eq "("} {
				incr inparen
			} elseif {$c eq {[}} {
				incr inbracket
				continue
			} elseif {$c eq ","} {
				append arg ""
				lappend args [clean-arg $arg]
				unset arg
				continue
			}
		} else {
			if {$c eq {[}} {
				incr inbracket
			} elseif {$c eq {]}} {
				if {[incr inbracket -1] == 0} {
					continue
				}
			}
		}
		append arg $c
	}
	if {[info exists arg]} {
		lappend args [clean-arg $arg]
	}
	#dputs "===> $args"
	return $args
}

proc count-chars {str c} {
	set i 0
	set n 0
	while {[set i [string first $c $str $i]] >= 0} {
		incr i
		incr n
	}
	return $n
}

proc check-complete {str} {
	if {[count-chars $str (] != [count-chars $str )]} {
		return 0
	}
	if {[count-chars $str \[] != [count-chars $str \]]} {
		return 0
	}
	return 1
}

proc add-complete-statement {n statement} {
	if {![regexp {^(.*?)\((.*?)\)$} $statement -> cmd args]} {
		# Maybe there is something after )
		if {![regexp {^(.*?)\((.*?)\)(.*)$} $statement -> cmd args rest]} {
			puts stderr "*** On line $n, failed to interpret:"
			puts stderr $statement
			puts stderr "\n*** If this is a nested macro, try indenting embedded macros"
			exit 1
		} else {
			lappend args [list # $rest]
		}
	}
	if {[string match {*,*} $args] || [string match {*\[*} $args]} {
		# Contains brackets and/or commas.
		# Need to split on commas and remove brackets
		set args [split-comma-args $args]
	} else {
		set args [list $args]
	}
	return [list ! $n $cmd $args]
}

# Converts a list of lines into a "program"
proc parse-autoconf {lines} {
	set n 0
	set statement {}
	set prog {}
	foreach line $lines {
		incr n
		set line [string trimright $line]
		regsub {\mdnl\M.*$} $line "" line
		if {$statement eq {}} {
			set statement [string trimleft $line]
			if {![string match {A[SCMX]_*} $statement]} {
				lappend prog [list # $statement]
				set statement {}
				continue
			}
		} elseif {[string match {A[SCMX]_*} $line]} {
			# Found a macro call in the left column, so assume the previous
			# statement is complete
			lappend prog [add-complete-statement [expr {$n - 1}] $statement]
			set statement $line
		} else {
			if {[string index $statement end] eq "\\"} {
				# Got a trailing backslash on the previous line, so combine the lines
				set statement [string range $statement 0 end-1]
				append statement " " [string trim $line]
			} else {
				append statement \n $line
			}
		}

		if {![string match *(* $statement]} {
			lappend prog [list ! $n $statement {}]
			set statement {}
			continue
		}

		# Is this statement complete?
		if {![string match *)* $statement]} {
			continue
		}

		if {[check-complete $statement]} {
			lappend prog [add-complete-statement $n $statement]
			set statement {}
		}
	}
	if {$statement ne ""} {
		dputs "Got some leftover: $statement"
		#exit 1
	}
	return $prog
}

proc output {msg} {
	puts $::outf "$::indent$msg"
}

# Finds AC_ARG_WITH and AC_ARG_ENABLE to
# output an appropriate options declaration
proc output-options {prog} {
	output "options {"

	# options
	foreach l $prog {
		set l [lassign $l type n cmd args]
		if {$type ne "#" && $cmd eq "AC_ARG_WITH"} {
			lassign $args opt help true false
			if {![regexp {=(.*?)\s+(.*)} $help -> arg desc]} {
				# This is actually a boolean option
				set arg ""
				set desc $help
				regexp {\s+(.*)} $desc -> desc
			} else {
				# Strip off any trailing ] or ,
				set arg :[string map [list \] "" , ""] $arg]
			}
			regsub -all {[()\[\]]} $desc "" desc
			output [format "\t%-15s  =>  %s" with-$opt$arg [list $desc]]
			continue
		}
		if {$type ne "#" && $cmd eq "AC_ARG_ENABLE"} {
			lassign $args opt help true false
			set def 0
			if {[regexp -- {--(enable|disable)-(.*?)\s+(.*)} $help -> ed arg desc]} {
				if {$ed eq "disable"} {
					set def 1
				}
			} else {
				set desc $help
			}
			# Remember the sense of this option
			set ::boolopts($opt) $def
			regsub -all {[()\[\]]} $desc "" desc
			output [format "\t%-15s  =>  %s" $opt=$def [list $desc]]
		}
	}
	output "}\n"
}

proc output-unknown {action} {
	set lines [lassign [split $action \n] first]
	output "# XXX $first"
	foreach l $lines {
		output "#     $l"
	}
}

proc output-auto-def {prog} {
	foreach l $prog {
		set l [lassign $l type]
		if {$type eq "#"} {
			lassign $l line
			set line [string trim $line]
			if {$line eq "" || [string match "#*" $line]} {
				output $line
			} elseif {[string match "dnl *" $line]} {
				output "# [string range $line 4 end]"
			} elseif {[regexp {([a-z0-9_]+)=(.*)} $line -> name val]} {
				output "set $name $val"
			} else {
				output-unknown $line
			}
		} else {
			lassign $l n cmd args
			dputs "! $n $cmd [llength $args] [join $args |]"
			if {[info procs $cmd] eq ""} {
				output-unknown [concat $cmd {*}$args]
				puts stderr "Unknown: $cmd"
			} else {
				if {[catch {$cmd {*}$args} msg]} {
					puts stderr "At line $n, could not understand $cmd"
					output-unknown [concat $cmd {*}$args]
				}
			}
		}
	}
}

proc split-comma-fields {str} {
	set result {}
	foreach i [split $str ,] {
		lappend result [string trim $i]
	}
	return $result
}

proc incr-level {} {
	append ::indent \t
}

proc decr-level {} {
	set ::indent [string range $::indent 0 end-1]
}

proc output-shell-action {action} {
	set prog [parse-autoconf [split $action \n]]
	incr-level
	output-auto-def $prog
	decr-level
}

proc AC_MSG_NOTICE {args} {
	output "msg-result [make-quoted-string [join $args]]"
}

proc AC_MSG_RESULT {args} {
	output "msg-result [make-quoted-string [join $args]]"
}

proc AC_MSG_WARN {args} {
	output "msg-result Warning: [make-quoted-string [join $args]]"
}

proc AC_MSG_ERROR {args} {
	output "user-error [make-quoted-string [join $args]]"
}

proc AC_MSG_CHECKING {args} {
	output "msg-checking [make-quoted-string "Checking [join $args]..."]"
}

proc AC_CONFIG_FILES {files} {
	foreach file $files {
		# XXX input file can have a different name
		output "make-template $file.in"
	}
}


proc AC_OUTPUT {{filename {}}} {
	AC_CONFIG_FILES $filename
	foreach header $::output_headers {
		output "make-config-header $header"
	}
	set ::output_headers {}
}

proc AC_CONFIG_HEADER {filename} {
	lappend ::output_headers $filename
}

proc AC_CONFIG_HEADERS {{filename config.h} args} {
	AC_CONFIG_HEADER $filename
}

proc AS_MKDIR_P {dir} {
	output [list file mkdir $dir]
}

proc AC_SYS_LARGEFILE {args} {
	output "use cc-lib"
	output "cc-check-lfs"
}

proc AC_CHECK_TOOL {define name {false ""}} {
	do-true-false "cc-check-tools $name" "" $false
}
proc AC_CHECK_PROG {define name def args} {
	output "if {!\[cc-check-progs $name\]} { define $define $def }"
}

proc AC_PROG_INSTALL {} {
	output "cc-check-progs install"
}
proc AC_PROG_LIBTOOL {} {
	output "cc-check-progs libtool"
}
proc AC_PROG_RANLIB {} {
	output "cc-check-tools ranlib"
}
proc AM_PROG_AR {} {
	output "cc-check-tools ar"
}
proc AC_PROG_CPP {} {
	output "cc-check-tools cpp"
}
proc AC_PROG_YACC {} {
	output "foreach prog {bison yacc} { if {\[cc-check-progs \$prog\]} { define YACC \$prog; break } }"
}

proc check-headers {args} {
	output "cc-check-includes $args"
}

proc AC_HEADER_STDC {args} {}
proc AC_HEADER_SYS_WAIT {args} {
	check-headers sys/wait.h
}
proc AC_HEADER_DIRENT {args} {
	check-headers dirent.h
}
proc AC_HEADER_TIME {args} {
	check-headers sys/time.h time.h
}
proc AC_HEADER_STAT {args} {
	check-headers sys/stat.h stat.h
}
proc AC_HEADER_STDBOOL {args} {
	check-headers stdbool.h
}
proc ac_type_xxx {type} {
	output "cc-with {-includes {stdlib.h unistd.h fcntl.h sys/types.h netinet/in.h}} {\n\tcc-check-types $type\n}"
}

proc AC_CHECK_HEADERS {hdrlist {true {}} {false {}} {decl {}}} {
	do-true-false "cc-check-includes $hdrlist" $true $false $decl
}

proc AC_CHECK_HEADER {header {true {}} {false {}}} {
	AC_CHECK_HEADERS $header $true $false
}

proc AC_TYPE_UID_T {args} {
	ac_type_xxx uid_t
}

proc AC_TYPE_MODE_T {args} {
	ac_type_xxx mode_t
}

proc AC_TYPE_PID_T {args} {
	ac_type_xxx pid_t
}

proc AC_TYPE_SIZE_T {args} {
	ac_type_xxx size_t
}

proc AC_TYPE_SSIZE_T {args} {
	ac_type_xxx ssize_t
}

proc AC_TYPE_OFF_T {args} {
	ac_type_xxx off_t
}

proc AC_CHECK_MEMBERS {typelist {true {}} {false {}} {decl {}}} {
	do-true-false [list cc-check-members {*}[split-comma-fields $typelist]] $true $false $decl
}
proc do-true-false {cmd true false {decl {}}} {
	if {$decl ne ""} {
		output "cc-with {[examine-cc-decl $decl]} \{"
		incr-level
	}
	if {$true eq "" && $false eq ""} {
		output $cmd
	} else {
		set not ""
		if {$true eq ""} {
			set not !
			set true $false
			set false ""
		}
		output "if {$not\[$cmd\]} \{"
		output-shell-action $true
		if {$false ne ""} {
			output "\} else \{"
			output-shell-action $false
		}
		output "\}"
	}
	if {$decl ne ""} {
		decr-level
		output "\}"
	}
}

proc AC_CHECK_TYPE {types {true ""} {false ""} {decl ""}} {
	do-true-false "cc-check-types $types" $true $false $decl
}

proc AC_CHECK_TYPES {types {true {}} {false {}} {decl {}}} {
	AC_CHECK_TYPE [split-comma-fields $types] $true $false $decl
}

proc AC_CHECK_FUNCS {funcs {true {}} {false {}}} {
	do-true-false "cc-check-functions $funcs" $true $false
}

proc AC_CHECK_DECLS {symbols {true {}} {false {}} {decl {}}} {
	do-true-false "cc-check-decls [split-comma-fields $symbols]" $true $false $decl
}


proc AC_FUNC_MEMCMP {args} {
	output "cc-check-functions memcmp"
}

proc AC_FUNC_FORK {args} {
	output "cc-check-functions fork"
}

proc AC_TYPE_SIGNAL {args} {
	output "cc-signal-return-type"
}

proc AC_CHECK_LIB {libname funcname {true {}} {false {}} {extralibs {}}} {
	if {$extralibs ne ""} {
		output "cc-with {-libs {$extralibs}} \{"
		incr-level
	}
	do-true-false "cc-check-function-in-lib $funcname $libname" $true $false
	if {$extralibs ne ""} {
		output "\}"
		decr-level
	}
}

proc AC_SEARCH_LIBS {funcname libnames {true {}} {false {}}} {
	AC_CHECK_LIB $libnames $funcname $true $false
}

proc AC_ARG_WITH {opt help true {false {}}} {
	output "if {\[opt-val with-$opt\] ne {}} {"
	output "\tset withval \[lindex \[opt-val with-$opt\] end\]"
	output-shell-action $true
	if {$false ne ""} {
		output "\} else \{"
		output-shell-action $false
	}
	output "}"
}

proc AC_ARG_ENABLE {opt help {true {}} {false {}}} {
	set not ""
	if {$::boolopts($opt)} {
		set not !
	}
	output "if {$not\[opt-bool $opt\]} {"
	output-shell-action $true
	if {$false ne ""} {
		output "\} else \{"
		output-shell-action $false
	}
	output "}"
}

proc AC_CACHE_CHECK {desc var action} {
	output-shell-action $action
}
proc AC_COMPILE_IFELSE {action {true {}} {false {}}} {
	# The macro definition here is nested, so we need to "unnest" it
	set action [split [string map {[[ [ ]] ]} $action] \n]
	set prog [parse-autoconf $action]
	lassign [lindex $prog 0] type n cmd args

	if {$cmd ne "AC_LANG_PROGRAM"} {
		output-unknown "AC_COMPILE_IFELSE $action $true $false"
	} else {
		lassign $args decl code
		AC_TRY_COMPILE $decl $code $true $false
	}
}

proc AC_LINK_IFELSE {action {true {}} {false {}}} {
	# The macro definition here is nested, so we need to "unnest" it
	set action [split [string map {[[ [ ]] ]} $action] \n]
	set prog [parse-autoconf $action]
	lassign [lindex $prog 0] type n cmd args

	if {$cmd ne "AC_LANG_PROGRAM"} {
		output-unknown "AC_COMPILE_IFELSE $action $true $false"
	} else {
		lassign $args decl code
		AC_TRY_LINK $decl $code $true $false
	}
}

proc AC_CACHE_VAL {var action args} {
	output-shell-action $action
}

proc AC_DEFINE {def args} {
	output "define $def"
}

proc AC_DEFINE_UNQUOTED {def value args} {
	output "define $def [make-quoted-string $value ]"
}

proc AC_CHECK_DECL {def {true {}} {false {}} {decl {}}} {
	do-true-false "cc-check-decls $def" $true $false $decl
}

proc AC_CHECK_SIZEOF {type {def ""}} {
	output "cc-check-sizeof [make-quoted-string $type]"
}

proc AC_FUNC_ALLOCA {args} {
	output "cc-check-alloca"
}
proc AC_FUNC_GETPGRP {} {
	output "cc-check-functions getpgrp"
}
proc AC_FUNC_VPRINTF {} {
	output "cc-check-functions vprintf"
}
proc AC_FUNC_WAIT3 {} {
	output "cc-check-functions wait3"
}
proc AC_FUNC_STRCOLL {} {
	output "cc-check-functions strcoll"
}
proc AC_CHECK_FUNC {func {true {}} {false {}}} {
	do-true-false "cc-check-functions $func" $true $false
}

# Examine declarations and try to pull out things like:
#   #include <abc/def.h>
# and
#   #ifdef HAVE_ABC_DEF_H
#   #include <abc/def.h>
#   #endif
#
# Returns a list like:
#   -includes {list} -declare {list}
#
proc examine-cc-decl {decl} {
	set omit_endif 0
	set includes {}
	set decls {}
	foreach line [split $decl \n] {
		if {$line eq ""} {
			continue
		}
		set line [string trimleft $line \[]
		set line [string trimright $line \]]
		if {[regexp {#\s*if(def)?\s+HAVE_} $line]} {
			incr omit_endif
			continue
		}
		if {$omit_endif && [string match "*#*endif*" $line]} {
			set omit_endif 0
			continue
		}
		if {[regexp {#\s*include.*<(.*)>} $line -> i]} {
			lappend includes $i
			continue
		}
		regsub -all {[\[\]} $line "" line
		lappend decls [string trim $line]
	}
	set result {}
	if {[llength $includes]} {
		lappend result -includes $includes
	}
	if {[llength $decls]} {
		lappend result -declare [join $decls \n]
	}
	return $result
}

proc AC_TRY_LINK {decl code {true {}} {false {}}} {
	if {[string match *\n* $code]} {
		set code \n$code\n
	}
	do-true-false "cctest -link 1 [examine-cc-decl $decl] -code {$code}" $true $false
}

proc AC_TRY_COMPILE {decl code {true {}} {false {}}} {
	if {[string match *\n* $code]} {
		set code \n$code\n
	}
	do-true-false "cctest [examine-cc-decl $decl] -code {$code}" $true $false
}

proc AC_LANG_WERROR {args} {
	output "define-append CFLAGS -Werror"
}

proc AC_GNU_SOURCE {args} {
	output "define-append CFLAGS -D_GNU_SOURCE"
}

proc AC_C_BIGENDIAN {args} {
	output "cc-check-endian"
}

set subst_msg 0
proc AC_SUBST {args} {
	if {$::subst_msg == 0} {
		incr ::subst_msg
		output "# XXX autosetup automatically substitutes all define'd values"
		output "#     In general, simply 'define' the value rather than using a shell"
		output "#     variable and AC_SUBST."
		output "#"
	}
	output-unknown [concat AC_SUBST {*}$args]
}

proc AC_PREREQ {version} {}
proc AC_INIT {filename args} {}
proc AC_PROG_CC {args} {}
proc AC_PROG_MAKE_SET {args} {}
proc AC_CANONICAL_HOST {args} {}
proc AC_C_CONST {args} {}
proc AC_PROG_GCC_TRADITIONAL {args} {}
proc AC_CONFIG_SRCDIR {args} {}
proc AC_CANONICAL_SYSTEM {args} {}
proc AC_EXEEXT {args} {}

# -------------------------

set infile [glob -nocomplain configure.in configure.ac]
switch [llength $infile] {
	0 {
		puts stderr "Could not find either configure.in or configure.ac"
		exit 1
	}
	2 {
		puts stderr "Both configure.in and configure.ac found. Please remove one"
		exit 1
	}
}

lassign $argv autodef
if {$autodef eq ""} {
	set autodef auto.def
}

if {[file exists $autodef]} {
	puts stderr "$autodef already exists. Will not overwrite it"
	exit 1
}

puts "Migrating $infile to $autodef"

set f [open $infile]
set lines [split [read $f] \n]
close $f

set prog [parse-autoconf $lines]

set outf [open $autodef w]

set indent ""
set output_headers {}

output "# Created by [file tail $argv0] - fix items marked XXX\n"
output "use cc cc-lib\n"

output-options $prog

output-auto-def $prog
close $outf

puts "Created $autodef. Now edit to resolve items marked XXX"
Deleted autosetup/misc.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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













































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2007-2010 WorkWare Systems http://www.workware.net.au/
# All rights reserved

# Module containing misc procs useful to modules
# Largely for platform compatibility

set autosetup(istcl) [info exists ::tcl_library]
set autosetup(iswin) [string equal windows $tcl_platform(platform)]

if {$autosetup(iswin)} {
	# mingw/windows separates $PATH with semicolons
	# and doesn't have an executable bit
	proc split-path {} {
		split [getenv PATH .] {;}
	}
	proc file-isexec {exec} {
		# Basic test for windows. We ignore .bat
		if {[file isfile $exec] || [file isfile $exec.exe]} {
			return 1
		}
		return 0
	}
} else {
	# unix separates $PATH with colons and has and executable bit
	proc split-path {} {
		split [getenv PATH .] :
	}
	proc file-isexec {exec} {
		file executable $exec
	}
}

# Assume that exec can return stdout and stderr
proc exec-with-stderr {args} {
	exec {*}$args 2>@1
}

if {$autosetup(istcl)} {
	# Tcl doesn't have the env command
	proc getenv {name args} {
		if {[info exists ::env($name)]} {
			return $::env($name)
		}
		if {[llength $args]} {
			return [lindex $args 0]
		}
		return -code error "environment variable \"$name\" does not exist"
	}
	proc isatty? {channel} {
		dict exists [fconfigure $channel] -xchar
	}
} else {
	if {$autosetup(iswin)} {
		# On Windows, backslash convert all environment variables
		# (Assume that Tcl does this for us)
		proc getenv {name args} {
			string map {\\ /} [env $name {*}$args]
		}
	} else {
		# Jim on unix is simple
		alias getenv env
	}
	proc isatty? {channel} {
		set tty 0
		catch {
			# isatty is a recent addition to Jim Tcl
			set tty [$channel isatty]
		}
		return $tty
	}
}

# In case 'file normalize' doesn't exist
#
proc file-normalize {path} {
	if {[catch {file normalize $path} result]} {
		if {$path eq ""} {
			return ""
		}
		set oldpwd [pwd]
		if {[file isdir $path]} {
			cd $path
			set result [pwd]
		} else {
			cd [file dirname $path]
			set result [file join [pwd] [file tail $path]]
		}
		cd $oldpwd
	}
	return $result
}

# If everything is working properly, the only errors which occur
# should be generated in user code (e.g. auto.def).
# By default, we only want to show the error location in user code.
# We use [info frame] to achieve this, but it works differently on Tcl and Jim.
#
# This is designed to be called for incorrect usage in auto.def, via autosetup-error
#
proc error-location {msg} {
	if {$::autosetup(debug)} {
		return -code error $msg
	}
	# Search back through the stack trace for the first error in a .def file
	for {set i 1} {$i < [info level]} {incr i} {
		if {$::autosetup(istcl)} {
			array set info [info frame -$i]
		} else {
			lassign [info frame -$i] info(caller) info(file) info(line)
		}
		if {[string match *.def $info(file)]} {
			return "[relative-path $info(file)]:$info(line): Error: $msg"
		}
		#puts "Skipping $info(file):$info(line)"
	}
	return $msg
}

# If everything is working properly, the only errors which occur
# should be generated in user code (e.g. auto.def).
# By default, we only want to show the error location in user code.
# We use [info frame] to achieve this, but it works differently on Tcl and Jim.
#
# This is designed to be called for incorrect usage in auto.def, via autosetup-error
#
proc error-stacktrace {msg} {
	if {$::autosetup(debug)} {
		return -code error $msg
	}
	# Search back through the stack trace for the first error in a .def file
	for {set i 1} {$i < [info level]} {incr i} {
		if {$::autosetup(istcl)} {
			array set info [info frame -$i]
		} else {
			lassign [info frame -$i] info(caller) info(file) info(line)
		}
		if {[string match *.def $info(file)]} {
			return "[relative-path $info(file)]:$info(line): Error: $msg"
		}
		#puts "Skipping $info(file):$info(line)"
	}
	return $msg
}

# Given the return from [catch {...} msg opts], returns an appropriate
# error message. A nice one for Jim and a less-nice one for Tcl.
# If 'fulltrace' is set, a full stack trace is provided.
# Otherwise a simple message is provided.
#
# This is designed for developer errors, e.g. in module code or auto.def code
#
#
proc error-dump {msg opts fulltrace} {
	if {$::autosetup(istcl)} {
		if {$fulltrace} {
			return "Error: [dict get $opts -errorinfo]"
		} else {
			return "Error: $msg"
		}
	} else {
		lassign $opts(-errorinfo) p f l
		if {$f ne ""} {
			set result "$f:$l: Error: "
		}
		append result "$msg\n"
		if {$fulltrace} {
			append result [stackdump $opts(-errorinfo)]
		}

		# Remove the trailing newline
		string trim $result
	}
}
Changes to autosetup/pkg-config.tcl.
11
12
13
14
15
16
17
18

19
20
21
22
23
24
25
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

module-options {
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
56

57
58
59
60

61
62
63
64
65
66
67
68
69
70
71
72
73
74
75



76
77
78
79
80
81
82
49
50
51
52
53
54
55

56
57
58
59
60
61
62
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} {
			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


111



112








113

114
115
116
117
118
119
120
121
122



123
124
125
126
127
128
129
130
131
132
133
134
135

















108
109
110
111
112
113
114
115
116

117
118
119
120
121
122
123
124
125
126
127
128

129
130
131
132
133
134
135



136
137
138
139
140
141
142
143
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]

	if {[catch {exec [get-define PKG_CONFIG] --modversion "$module $args"} version]} {
	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 "pkg-config --modversion $module $args: $version"
		configlog $cflags
		return 0
	}
	msg-result $version
	set prefix [feature-define-name $module PKG_]
	define HAVE_${prefix}
	define ${prefix}_VERSION $version
	define ${prefix}_LIBS [exec pkg-config --libs-only-l $module]
	define ${prefix}_LDFLAGS [exec pkg-config --libs-only-L $module]
	define ${prefix}_CFLAGS [exec pkg-config --cflags $module]
	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
}
Deleted autosetup/sys-find-tclsh.
1
2
3
4
5
6
7
8
9
10










-
-
-
-
-
-
-
-
-
-
#!/bin/sh
# Looks for a suitable tclsh or jimsh in the PATH
d=`dirname "$0"`
{ "$d/jimsh0" "$d/autosetup-test-tclsh"; } 2>/dev/null && exit 0
PATH="$PATH:$d"; export PATH
for tclsh in jimsh tclsh tclsh8.5 tclsh8.6; do
	{ $tclsh "$d/autosetup-test-tclsh"; } 2>/dev/null && exit 0
done
echo 1>&2 "No installed jimsh or tclsh"
echo false
Changes to autosetup/system.tcl.
23
24
25
26
27
28
29
30

31
32
33
34
35
36
37
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]]
}

module-options [subst -noc -nob {
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
55

56
57
58
59
60
61
62
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
148

149
150
151
152
153
154
155
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
186

187
188
189
190
191
192
193
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]} {
				} 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
Deleted autosetup/text-formatting.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119























































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2010 WorkWare Systems http://www.workware.net.au/
# All rights reserved

# Module which provides text formatting

use formatting

proc wordwrap {text length {firstprefix ""} {nextprefix ""}} {
	set len 0
	set space $firstprefix

	foreach word [split $text] {
		set word [string trim $word]
		if {$word eq ""} {
			continue
		}
		if {[info exists partial]} {
			append partial " " $word
			if {[string first $quote $word] < 0} {
				# Haven't found end of quoted word
				continue
			}
			# Finished quoted word
			set word $partial
			unset partial
			unset quote
		} else {
			set quote [string index $word 0]
			if {$quote in {' *}} {
				if {[string first $quote $word 1] < 0} {
					# Haven't found end of quoted word
					# Not a whole word.
					set first [string index $word 0]
					# Start of quoted word
					set partial $word
					continue
				}
			}
		}

		if {$len && [string length $space$word] + $len >= $length} {
			puts ""
			set len 0
			set space $nextprefix
		}
		incr len [string length $space$word]

		# Use man-page conventions for highlighting 'quoted' and *quoted*
		# single words.
		# Use x^Hx for *bold* and _^Hx for 'underline'.
		#
		# less and more will both understand this.
		# Pipe through 'col -b' to remove them.
		if {[regexp {^'(.*)'(.*)} $word -> quoted after]} {
			set quoted [string map {~ " "} $quoted]
			regsub -all . $quoted "&\b&" quoted
			set word $quoted$after
		} elseif {[regexp {^[*](.*)[*](.*)} $word -> quoted after]} {
			set quoted [string map {~ " "} $quoted]
			regsub -all . $quoted "_\b&" quoted
			set word $quoted$after
		}
		puts -nonewline $space$word
		set space " "
	}
	if {[info exists partial]} {
		# Missing end of quote
		puts -nonewline $space$partial
	}
	if {$len} {
		puts ""
	}
}
proc title {text} {
	underline [string trim $text] =
	nl
}
proc p {text} {
	wordwrap $text 80
	nl
}
proc codelines {lines} {
	foreach line $lines {
		puts "	  $line"
	}
	nl
}
proc nl {} {
	puts ""
}
proc underline {text char} {
	regexp "^(\[ \t\]*)(.*)" $text -> indent words
	puts $text
	puts $indent[string repeat $char [string length $words]]
}
proc section {text} {
	underline "[string trim $text]" -
	nl
}
proc subsection {text} {
	underline "$text" ~
	nl
}
proc bullet {text} {
	wordwrap $text 76 "	 * " "	  "
}
proc indent {text} {
	wordwrap $text 76 "	   " "	  "
}
proc defn {first args} {
	if {$first ne ""} {
		underline "	   $first" ~
	}
	foreach p $args {
		if {$p ne ""} {
			indent $p
		}
	}
}
Changes to autosetup/tmake.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
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

module-options {}
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.
Deleted autosetup/util.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66


































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2012 WorkWare Systems http://www.workware.net.au/
# All rights reserved

# Module which contains miscellaneous utility functions

# @compare-versions version1 version2
#
# Versions are of the form 'a.b.c' (may be any number of numeric components)
#
# Compares the two versions and returns:
## -1 if v1 < v2
##  0 if v1 == v2
##  1 if v1 > v2
#
# If one version has fewer components than the other, 0 is substituted to the right. e.g.
## 0.2   <  0.3
## 0.2.5 >  0.2
## 1.1   == 1.1.0
#
proc compare-versions {v1 v2} {
	foreach c1 [split $v1 .] c2 [split $v2 .] {
		if {$c1 eq ""} {
			set c1 0
		}
		if {$c2 eq ""} {
			set c2 0
		}
		if {$c1 < $c2} {
			return -1
		}
		if {$c1 > $c2} {
			return 1
		}
	}
	return 0
}

# @suffix suf list
#
# Takes a list and returns a new list with '$suf' appended
# to each element
#
## suffix .c {a b c} => {a.c b.c c.c}
#
proc suffix {suf list} {
	set result {}
	foreach p $list {
		lappend result $p$suf
	}
	return $result
}

# @prefix pre list
#
# Takes a list and returns a new list with '$pre' prepended
# to each element
#
## prefix jim- {a.c b.c} => {jim-a.c jim-b.c}
#
proc prefix {pre list} {
	set result {}
	foreach p $list {
		lappend result $pre$p
	}
	return $result
}
Deleted autosetup/wiki-formatting.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62






























































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Copyright (c) 2010 WorkWare Systems http://www.workware.net.au/
# All rights reserved

# Module which provides text formatting
# wiki.tcl.tk format output

use formatting

proc joinlines {text} {
    set lines {}
    foreach l [split [string trim $text] \n] {
        lappend lines [string trim $l]
    }
    join $lines
}
proc p {text} {
    puts [joinlines $text]
    puts ""
}
proc title {text} {
    puts "*** [joinlines $text] ***"
    puts ""
}
proc codelines {lines} {
    puts "======"
    foreach line $lines {
        puts "    $line"
    }
    puts "======"
}
proc code {text} {
    puts "======"
    foreach line [parse_code_block $text] {
        puts "    $line"
    }
    puts "======"
}
proc nl {} {
}
proc section {text} {
    puts "'''$text'''"
    puts ""
}
proc subsection {text} {
    puts "''$text''"
    puts ""
}
proc bullet {text} {
    puts "   * [joinlines $text]"
}
proc indent {text} {
    puts "    :    [joinlines $text]"
}
proc defn {first args} {
    if {$first ne ""} {
        indent '''$first'''
    }

    foreach p $args {
        p $p
    }
}
Deleted bin/.agignore.
1
2


-
-
*.pt
*.rk05
Changes to bin/.ignore.
1



1
2
-
+
+
.agignore
*.pt
*.rk05
Changes to bin/os8-cp.in.
1

2
3
4
5
6
7
8
9

10
11
12
13
14
15
16

1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16
-
+







-
+







#!/usr/bin/env python
#!/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 by Bill Cattey and Warren Young
# 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
62

63
64
65
66
67
68
69
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_BOOT_DISK@"
_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
115

116
117
118
119
120
121
122
123
124
125
126
127
128
129

130
131
132
133
134
135
136
108
109
110
111
112
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
  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)
      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
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
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."
    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 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
      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:
      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
        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
        print("Unrecognize option in line: " + ioline)
      elif source == None:
        print "Null value of source. Ignoring line: " + ioline
        print("Null value of source. Ignoring line: " + ioline)
      elif destination == None:
        print "Null value of destination. Ignoring line: " + ioline
        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
259

260
261
262
263
264

265
266
267
268
269
270
271
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 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."
    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
291

292
293
294
295
296
297
298
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)
    # 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
315


316
317
318
319
320
321
322
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
      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
518

519
520

521
522
523
524
525
526
527
528
529
530
531
532


533
534
535
536
537
538
539
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
        print(VERBOSE_USAGE)
      else:
        print USAGE
        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]
        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
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
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
        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."
          if DEBUG: print(arg + " is POSIX.")
          more_files = glob.glob(arg)
          if more_files == []:
            if DEBUG:
            if DEBUG: print "No more files in POSIX Glob. Our file is: " + arg
              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:
              if DEBUG: print "Globber: Setting initial source: " + source + " and mode: " + first_mode
                print("Globber: Setting initial source: " + source + \
                    " and mode: " + first_mode)
            elif filespec_seen == 1:
              if DEBUG:
              if DEBUG: print "Globber: Setting initial destination: " + destination
                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:
            if DEBUG: print "Setting initial source: " + source + " and mode: " + first_mode
              print("Setting initial source: " + source + \
                  " and mode: " + first_mode)
          elif filespec_seen == 1:
            destination = arg
            if DEBUG: print "Setting initial destination: " + destination
            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 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
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
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)
  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 + '!'
    print("Could not start simulator: " + e.message + '!')
    exit (1)
  # s.set_logfile (os.fdopen (sys.stdout.fileno (), 'w', 0))
  s.set_logfile (open ("logfile.txt", 'w'))
  # 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.send_cmd ("att " + simh_boot_dev + " " + imagename)
    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:
      if VERBOSE or DEBUG: print "Modifying existing " + simh_dev + " image " + imagename
        print("Modifying existing " + simh_dev + " image " + imagename)
    else:
      if VERBOSE or DEBUG:
      if VERBOSE or DEBUG: print "Will create a new image file named: " + imagename
        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.send_cmd ("att " + simh_dev + " " + imagename)
      print("Attaching " + simh_dev + " to " + imagename)
    s.simh_cmd ("att " + simh_dev + " " + imagename, debug=DEBUG)

  if VERBOSE or DEBUG: print "Booting " + simh_boot_dev + "..."
  s.send_cmd ("boot " + simh_boot_dev)
  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:
        if VERBOSE or DEBUG: print "Initializing directory of " + os8name + " in " + imagename
        s.os8_send_cmd ('\\.', "ZERO " + os8name)
          print("Initializing directory of " + os8name + " in " + \
              imagename)
        s.os8_cmd ("ZERO " + os8name, debug=DEBUG)
    else:
      os8name = os8dev + att_spec[1] + ":"
      if VERBOSE or DEBUG:
      if VERBOSE or DEBUG: print "Initializing directory of " + os8name + " in " + imagename
      s.os8_send_cmd ('\\.', "ZERO " + os8name)
        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:
    if DEBUG: print "Source: " + source + ", Destination: " + destination + ", Mode: " + mode_opt + "."
      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)
      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
        if DEBUG: print("Wild card dev: " + os8dev)
        # Use OS/8 Direct to enumerate our input files.
        if DEBUG:
        if DEBUG: print "Calling OS/8 DIRECT on wild card filespec: " + source
        s.os8_send_cmd ('\\.', "DIR " + source + "/F=1")
          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)
        # 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: " + \
            print "Wildcard call os8_pip_from: copy from: {" + os8dev + "}{" + filename + "}" + \
              " to: " + destination + ", mode: " + pip_option 
          s.os8_pip_from(os8dev + filename, destination, pip_option)
                "{" + 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)
          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_send_cmd ('\\.', "COPY " + destination + "< " + source)
        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.back_to_cmd ('\\.')
  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.send_cmd ("det " + simh_dev)
      print("Detaching " + simh_dev)
    s.simh_cmd ("det " + simh_dev, debug=DEBUG)
  if VERBOSE or DEBUG:
    print "Detaching " + simh_boot_dev
  s.send_cmd ("det " + simh_boot_dev)
    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.send_cmd ('quit')
    print("Quitting simh.")
  s._child.sendline("quit")

if __name__ == "__main__": main()
Deleted bin/os8-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




































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#!/usr/bin/env python
# -*- 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 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.iteritems():
    max_obn_len = max(max_obn_len, len(obn))
  for obn, vals in os8opts.opts.iteritems():
    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', 'a') \
      if not VERY_VERBOSE else os.fdopen (sys.stdout.fileno (), 'w', 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.send_cmd ("detach all")

  s.quit ()
  if VERBOSE: print "Done!"

  
if __name__ == "__main__":
    main()
Added bin/os8-run.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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()
Added bin/os8pkg.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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()
Changes to bin/pidp8i.in.
1
2
3
4

5
6

7
8
9
10
11
12
13
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(1) session.
#   systemd user service and its associated screen manager session.
#
# Copyright © 2015-2019 Oscar Vermeulen and Warren Young
# 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







41
42



43
44
45







46


47
48
49
50
51
52
53





54
55




56


57
58
59

60
61
62
63
64
65
66
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58


59
60
61
62
63
64
65
66
67
68
69
70
71

72
73
74
75
76
77
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
        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:]]+'
        screen -ls pidp8i | grep -Eo '[[:digit:]]+\.pidp8i' | grep -Eo '^[[:digit:]]+'
    fi
}

# Were we given a command line argument?
if [ -z "$1" ]
then
    # No, so just try to attach to the running simulator
    if is_running
    # 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
        screen -r -S pidp8i
            exec screen -r -S pidp8i
        fi
    else
        cat <<ERROR
Either the simulator isn't running, or it isn't running under a screen(1)
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

127
128
129
130
131
132























133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154











155
156
157
158
159
160
161
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" &&
        screen -dm -S pidp8i "$sim" "$bscript" &&
		( ! test -x $systemctl ||
		  systemd-notify --ready --pid=$(sim_child_pid) ) &&
		exit 0
    exit 1
    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

            # screen(1) might still be running despite its only child
            # dying.  Nuke it hard if so.
            if is_running ; then screen -S pidp8i -X quit ; fi
            # 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
Deleted bin/teco-pi-demo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

























































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#!/usr/bin/env python
# -*- 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-2019 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 = len (sys.argv) > 1 and sys.argv[1] == '-b'

  # 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 (), 'w', 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 + "..."
  s.send_cmd ("att rk0 " + rk)
  s.send_cmd ("boot rk0")

  # Start TECO8 in the simulator under OS/8
  s.os8_send_cmd ('\\.', "R TECO")

  # 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_cmd ('\\*', 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:
      # Explicitly shift back from OS/8 context to SIMH command context.
      # We cannot rely on class simh to do this automatically because it
      # expects to see a . prompt from the prior command, but we're
      # still in TECO here, so we must be explicit.
      s.os8_send_ctrl ('e')

      # Ask the simulator what IPS rate we ran that benchmark at.
      s.send_cmd ('show clocks')
      line = s.read_tail ('Execution Rate:')
      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.send_cmd ('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"
  else:
    # 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.
    time.sleep (0.02)       # FIXME: simulator chokes on 'cont' without this
    s.os8_send_ctrl ('e')   # same justification as above
    s.send_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_cmd ('cont')
    s.spin ()


if __name__ == "__main__":
    main()
Added bin/teco-pi-demo.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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()
Deleted bin/txt2os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151























































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#!/usr/bin/env python
# -*- coding: utf-8 -*-
########################################################################
# Create a tu56 or rk05 image and fill it with ASCII files, i.e.  source code.
#
# It is intended to be be called manually when we have a POSIX
# directory full of ASCII files we want to bulk-copy into SIMH.
#
# The argument is taken both as the name of the image to create
# and the list of files to copy in.
#
# For now, it takes all input and produces all output in the
# current working directory.
#
# IMPORTANT:  Currently all input files are mindlessly passed through
# txt2ptp which transforms POSIX ASCII files to OS/8 ASCII files.
# It WILL mutilate non-ASCII files.
#
# This program is based on the old cc8-tu56-update program, last
# shipped by this project in release v20171222.
#
# Copyright © 2017 by Warren Young and Bill 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.
########################################################################

# Bring in just the basics so we can bring in our local modules
import os
import sys
import argparse

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


#### GLOBALS AND CONSTANTS #############################################

progmsg = True


#### main ##############################################################

def main ():
  global progmsg

  # Set up the arg parser and use it to parse the command line.
  parser = argparse.ArgumentParser()
  parser.add_argument("name",
                      help="Create an OS/8 image from a list of ASCII files.")
  group = parser.add_mutually_exclusive_group(required=True)
  group.add_argument("--tu56", "-t", action="store_true")
  group.add_argument("--rk05a", "-ra", action="store_true")
  group.add_argument("--rk05b", "-rb", action="store_true")

  args = parser.parse_args()
  
  print "Filename: " + args.name
  if args.tu56:
    sdev = "dt0"
    os8dev = "DTA0:"
    imagename = args.name + ".tu56"
    stat_str = "DECtape"

  if args.rk05a:
    sdev = "rk1"
    os8dev = "RKA1:"
    imagename = args.name + ".rk05"
    stat_str = "partition A of"
    
  if args.rk05b:
    sdev = "rk1"
    os8dev = "RKB1:"
    imagename = args.name + ".rk05"
    stat_str = "partition B of"
  
  listname = args.name + ".list"

  # 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 (), 'w', 0))

  # Attach a clean version of the image to the simulator
  if os.path.exists (imagename):
    print "Overwriting old " + stat_str + " image " + imagename

  s.send_cmd ("att " + sdev + " " + imagename)

  # Find and boot the bootable OS/8 disk.  Use the "patched" version
  # because that is what "make run" uses; we use that command to
  # inspect this script's work.
  rk = os.path.join (dirs.os8mo, 'os8v3d-patched.rk05')
  if not os.path.isfile (rk):
    print "Could not find " + rk + "; OS/8 media not yet built?"
    exit (1)
  print "Booting " + rk + "..."
  s.send_cmd ("att rk0 " + rk)
  s.send_cmd ("boot rk0")

  s.os8_send_cmd ('\\.', "ZERO " + os8dev)

  manifest = open (listname, "r")

  for line in manifest:
    src = line.strip()
    if src == "": continue
    if src[0] == '#': continue      # Allow commenting out files

    dest = src.upper ()
    s.os8_send_file (src, os8dev + dest)

  # Exit simulator nicely so that image detaches cleanly
  s.back_to_cmd ('\\.')
  s.send_cmd ("det " + sdev)
  s.send_cmd ('quit')


if __name__ == "__main__": main()
Changes to boot/0.script.in.
18
19
20
21
22
23
24
25

26
27
28

29
30

31
32
33
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 @srcdir@/boot/common.script
@include boot/common.script

@define SHORTNAME 0
@include @srcdir@/boot/savestate.script
@include @ABSSRCDIR@/boot/savestate.script

att rk0 @MEDIADIR@/os8/@OS8_BOOT_DISK@
att rk0 @MEDIADIR@/os8/@OS8_RUNTIME@
boot rk0

:end
Changes to boot/2.script.in.
1
2
3
4
5
6

7
8
9
10
11

12
13
14
15
16
17
18
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 @srcdir@/boot/common.script
@include boot/common.script

set rf enabled

@define SHORTNAME 2
@include @srcdir@/boot/savestate.script
@include @ABSSRCDIR@/boot/savestate.script

load @MEDIADIR@/tss8/tss8_init.bin
attach rf @MEDIADIR@/tss8/tss8_rf.dsk
attach ttix 4000
run 24200

:end
Changes to boot/3.script.in.
1
2
3
4
5

6
7
8
9
10
11
12
13
14

15
16
17
18
19
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 @srcdir@/boot/common.script
@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 @srcdir@/boot/savestate.script
@include @ABSSRCDIR@/boot/savestate.script

attach @SIMH_TAPE_DEVICE@0 @MEDIADIR@/os8/@OS8_BOOT_TAPE@
boot @SIMH_TAPE_DEVICE@0

:end
Changes to boot/4.script.in.
13
14
15
16
17
18
19
20

21
22
23
24
25
26

27
28
29
30
31
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 @srcdir@/boot/common.script
@include boot/common.script

at ttix 2222
set ttox0 8b

@define SHORTNAME 4
@include @srcdir@/boot/savestate.script
@include @ABSSRCDIR@/boot/savestate.script

load @MEDIADIR@/spacewar/spacewar.bin
g 200

:end
Changes to boot/6.script.in.
1
2
3
4

5
6
7
8
9
10

11
12
13
14
15
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 @srcdir@/boot/common.script
@include boot/common.script

set tsc enabled
attach ttix 4000

@define SHORTNAME 6
@include @srcdir@/boot/savestate.script
@include @ABSSRCDIR@/boot/savestate.script

att rk0 @MEDIADIR@/etos/etosv5b-demo.rk05
boot -d rk0

:end
Changes to boot/run-v3f.script.in.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
17
18

19
20
21
22
23
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 @srcdir@/boot/common.script
@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 @srcdir@/boot/savestate.script
@include @ABSSRCDIR@/boot/savestate.script

attach @SIMH_TAPE_DEVICE@0 bin/v3f-@OS8_TAPE_DEVICE@.tu56
boot @SIMH_TAPE_DEVICE@0

:end
Changes to boot/run.script.in.
1
2
3
4
5
6

7
8
9

10
11

12
13
14
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 @srcdir@/boot/common.script
@include boot/common.script

@define SHORTNAME run
@include @srcdir@/boot/savestate.script
@include @ABSSRCDIR@/boot/savestate.script

att rk0 bin/@OS8_BOOT_DISK@
att rk0 bin/@OS8_RUNTIME@
boot rk0

:end
Changes to boot/tss8.script.in.
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15

16
17
18
19
20
21
22
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 @srcdir@/boot/common.script
@include boot/common.script

set rf enabled
!cp -n media/tss8/tss8_rf.dsk bin

@define SHORTNAME tss8
@include @srcdir@/boot/savestate.script
@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

Changes to doc/OS-images.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
1
2
3
4


5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20
21
22
23
24
25

26
27
28
29
30
31
32


33
34
35
36
37
38
39
40
41
42
43


44
45
46
47
48
49
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 Raspbian OS images you can download from [the PiDP-8/I development
site][1] are based on the [official Raspbian images][2], so the
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.

You will need to use a 2 GB or larger SD card.
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 Raspbian Stretch Lite
| `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 this disk image and the official Raspbian
Lite image is the default user name and password:
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 my other guide, "[How
to Run a Naked PiDP-8/I][6]."
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/
Changes to doc/RELEASE-PROCESS.md.
31
32
33
34
35
36
37
















38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60



61
62
63
64
65
66

67
68
69
70
71
72
73
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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.

[cl]: https://tangentsoft.com/pidp8i/doc/trunk/ChangeLog.md


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.
## Build and Update the Fossil Binary

If a new release of Fossil has come out since the last release, the
`wget` link in `tools/bosi` is probably stale. Build an updated binary,
run `tools/publish-fossil`, then replace the file name part of the URL
in `tools/bosi` to pull that new version.
[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
90

91
92
93
94



95
96
97
98
99
100
101
102

103

104
105
106
107
108
109
110
111
112
113
114
115
116
117



118

119
120

121




122
123



124
125
126
127
128
129
130

131
132
133
134
135
136

137
138
139
140

141
142
143
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
95
96
97
98
99
100
101

102
103
104
105

106
107
108
109
110
111
112
113
114
115
116
117

118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

136
137

138
139
140
141
142
143
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 [Raspbian Lite][os] on a multi-core
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.
    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
    Log in, then retreive and initialize BOSI:
    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.

3.  Clone the software repo and build the softare:
    Clone the software repo and build the software:

        $ ./bosi build
        $ ./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.
    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 final inside-the-image steps:
4.  Do the final inside-the-image steps:

        $ ./bosi prepare

5.  Move the SD card to a USB reader plugged into the Pi, boot the Pi
    from its prior SD card, and shrink the OS image:

5.  After the Pi shuts down, move the SD card to a micro SD card reader plugged
        $ wget https://tangentsoft.com/bosi
        $ chmod +x bosi
        $ ./bosi shrink

    into the Mac¹ and say:
6.  Move the USB reader to the Mac,¹ then say:

        $ bosi image [nls]

    For the ILS images, you can give "ils" as a parameter or leave it
    Give "ils" as a parameter or leave it blank for the ILS image.
    blank.

7.  The prior step rewrote the SD card with the image file it created.
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 desktop PC*.
    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/downloads/raspbian/
[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 `image` and `finish` steps.
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
190

191
192
193
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-2017 by Warren Young. This document is licensed under
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
Changes to doc/cc8-manual.md.
28
29
30
31
32
33
34
35

36
37
38
39
40
41
42
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 lead to C’s own
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
86

87
88
89
90
91
92
93
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 12&nbsp;kWords of core](#memory) at run time for programs
*   [At least 16&nbsp;kWords of core](#memory) at run time for programs
    compiled with CC8.  The [native OS/8 CC8 compiler passes](#ncpass)
    require 20&nbsp;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&nbsp;kWords of core.

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
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:** `&`, &brvbar;, `~` and `!`
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.  **A few 2-character operators:** `++`, `--` (postfix only) and `==`.
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, but they may not work as expected when deeply nested or
    in long `if/else if/...` chains.
    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/cc8/examples/fib.c

[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.

    Because the types are already known, it is not necessary to give
    types when declaring function arguments:
    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:

        myfn(n) { /* do something with n */ }
        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, if not the return type, per K&R C rules:
    types to be declared but not the return type, per K&R C rules:

        myfn(n)
        int myfn(n)
        int n;
        {
            /* do something with 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, but the
    The cross-compiler supports `void` as an extension to K&R C. This type
    native compiler does not, and it is not yet smart enough to flag
    code including it with an error. It will simply generate bad code
    when you try to use `void`.
    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
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
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`.
    *   [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.  There is no `&&` nor &brvbar;&brvbar;, nor are there plans to add
    them in the future.  Neither is there support for complex relational
    operators like `>=` nor even `!=`.  Abandon all hope for complex
    assignment operators like `+=`.
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.

    Most of this can be worked around through clever coding. For
    example, this:
    You can work around such differences with clever coding. For
    example, this code for a conforming C compiler:

        if (i != 0 || j == 5)

    could be rewritten to avoid both missing operators as:
    should be rewritten for CC8 to avoid the precedence changes as:

        if (!(i == 0) | (j == 5))
        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



495




























496
497
498
499
500
501
502
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.
12. `switch` doesn't work.

    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
663
664
665




666
667
668
669
670
671
672
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&nbsp;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 functions. If we ever fix
any of the limitations we’ve identified below, consider it “gravy”
rather than any kind of obligation fulfilled.
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
715

716
717
718
719




720
721








722
723
724
725
726
727
728
729
730
731
732
733
734
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>`atoi(s, outlen)`
### <a id="atoi"></a>`int atoi(s, *result)`

Takes a null-terminated ASCII character string pointer `s` and returns a
12-bit PDP-8 two’s complement signed integer. The length of the numeric
string is returned in `*outlen`.
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.

*   The `outlen` parameter is nonstandard.


### <a id="cupper"></a>`cupper(p)`

Implements this loop more efficiently:

    char* tmp = p;
    while (*tmp) {
896
897
898
899
900
901
902
903

904
905
906
907
908
909
910
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/HACKERS.md#patches
[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
1241

1242
1243
1244

1245
1246

1247
1248
1249


1250
1251
1252
1253
1254
1255
1256
1257
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="sscanf"></a>`sscanf`
### <a id="scanf" name="fscanf"></a>`fscanf`, `scanf`, `sscanf`

Reads formatted input from a file.

Parse strings according to a `printf`-like format specification. `scanf`
**Standard Violations:**

gets the string from the interactive terminal, `fscanf` gets it from a
*   `[f]scanf()` is not provided. Call [`[f]gets()`](#gets) to get a
    string and then call `sscanf()` on it.

file opened with [`fopen()`](#fopen), and `sscanf` gets it from a
NUL-terminated C string already in core.
*   This list cannot possibly be complete.

**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
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
1380
1381
1382
1383
1384
1385











1386
1387
1388
1389

1390
1391
1392
1393
1394
1395
1396
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.

If you look in `src/cc8/examples`, you will find these same programs
plus `basic.c`, a simple BASIC language interpreter. This one is
not preinstalled because its complexity is currently beyond the
capability of the OS/8 version of CC8. To build it, you will have
to use [the cross-compiler](#cross), then assemble the resulting
`basic.sb` file under OS/8.
*   **<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
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
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
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

It may surprise you to learn that literals are placed in the same field
as globals and the call stack.
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.

Other C compilers place literals in among the executable code instead, a
fact that’s especially helpful on [Harvard architecture
microcontrollers][harch] with limited RAM. We don’t do it that way in
CC8 because literals are implemented in terms of the SABR `COMMN`
feature, which in turn is how OS/8 FORTRAN II implements `COMMON`. These
subsystems have no concept of “storage type” as in modern C compilers.
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.

[harch]: https://en.wikipedia.org/wiki/Harvard_architecture


### <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
1928

1929
1930
1931
1932
1933
1934
1935
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)|
|`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|
Added doc/class-os8script.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
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
Changes to doc/class-simh.md.
10
11
12
13
14
15
16


17
18
19
20
21
22
23
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
89

90
91
92
93
94
95


96
97
98
99
100
101
102


























































































103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124




125
126
127
128
129
130
131



132
133
134
135
136
137

138
139
140
141
142
143
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
84
85
86
87
88
89
90

91
92
93
94
95


96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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 (), 'w', 0))
    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', 'a') \
        if not VERY_VERBOSE else os.fdopen (sys.stdout.fileno (), 'w', 0))
    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.send_cmd ("att rk0 " + rk)
    s.send_cmd ("boot rk0")

    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")
This shows one of the most-used methods, `simh.send_cmd`, which sends a
line of text along with a carriage return to the spawned child program,
which again is `pidp8i-sim`.


## Driving SIMH and OS/8

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,
After the simulator starts up, we want to wait for an OS/8 “`.`” prompt
and then send the first OS/8 command to start our demo. We use the
`simh.os8_send_cmd` method for that:

    s.os8_send_cmd ('\\.', "R TECO")

    main 1: Expecting Prompt. Instead got: Fatal Error
This method differs from `send_cmd` in a couple of key ways.

First, it waits for a configurable prompt character — sent as the first
parameter — before sending the command.  This is critical when driving
OS/8 because OS/8 lacks a keyboard input buffer, so if you send text to
it too early, all or part of your input is likely to be lost, so your
command won't work.

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
Second, because OS/8 can only accept so many characters of input per
second, `os8_send_cmd` inserts a small delay between each input
character to prevent character losses.
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")
(See the commentary for `simh._kbd_delay` if you want to know how that
delay value was calculated.)



The bulk of `teco-pi-demo` consists of more calls to `simh.os8_send_cmd`
and `simh.send_cmd`. Read the script if you want more examples.
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:** The “`\\.`” syntax for specifying the OS/8 `.` command
prompt is tricky. If you pass just `'.'` here instead, Python's
[regular expression][re] matching engine will interpret it to mean
**IMPORTANT:** When you specify the [regular expression][re] strings
that it should match *any* character as the prompt, almost certainly
breaking your script's state machine, since it is likely to cause the
call to return too early. If you instead pass `'\.'`, Python's string
for result matching, and want literal matches for characters that
are special to regular expressions such as dot `.`, asterisk `*`,
parser will take the backslash as escaping the period and again pass
just a single period character to the regex engine, giving the same
result. You must specify it exactly as shown above to escape the
backslash so that Python will send an escaped period to the regex
engine, which in turn is necessary to cause the regex engine to treat
it as a literal period rather than the "any character" wildcard.

etc., you need to be preface the characterpair of backslashes.
Much the same is true when your script needs to await the common
<code>*</code> prompt character: you must pass it like so:

Example:  To match a literal dollar sign you would say `\\$`.
    s.os8_send_cmd ('\\*', 'COMMAND')

[re]: https://en.wikipedia.org/wiki/Regular_expression


## Contexts
## Escaping OS/8 to SIMH

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.
Sometimes you need to escape from OS/8 back to SIMH with a
<kbd>Ctrl-E</kbd> keystroke so that you can send more SIMH commands
after OS/8 starts up. This accomplishes that:


### 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.
    s.os8_send_ctrl ('e')

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)
While out in the SIMH context, you *could* continue to call the
`simh.os8_*` methods, but since SIMH can accept input as fast as your
program can give it, it is best to use methods like `simh.send_cmd`
which don't insert artificial delays.  For many programs, this
difference won't matter, but it results in a major speed improvement in
a program like `os8-run` which sends many SIMH and OS/8 commands
back-to-back!

```

### 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.
The way `teco-pi-demo` does it is to send a `cont` command to SIMH:

The problem with this method is that it sometimes hangs the simulator.
The solution is to insert a small delay *before* escaping to the SIMH
context. I'm not sure why this is sometimes necessary. My best guess is
required to give OS/8 time to settle into an interruptible state before
escaping to SIMH, so that on "continue," we re-enter OS/8 in a sane
state.
```
    s.send_line ('cont')
```

You can usually avoid the need for that delay by waiting for an OS/8
command prompt before escaping to SIMH, since that is a reliable
A previous version of the simh class would sometime hang the
simulator unless a small delay were inserted before escaping to
indicator that OS/8 is in such an interruptible state.

the SIMH context.  We believe this is no longer necessary.
You don't see these anomalies when using OS/8 interactively because
humans aren't fast enough to type commands at OS/8 fast enough to cause
the problem.  That is doubtless why this bug still exists in OS/8
However the problems with `cont` made implementors gun shy
in 2017.
using it.  Most code you will see does a restart with an explicit
confirmation we are at the OS/8 command level.


### Re-Entering
### 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.os8_restart` method to
avoid the need for a delay *or* a reboot.  It re-calls OS/8's entry
point from SIMH context, which we've found through much testing is
entirely reliable, as compared to sending a SIMH `cont` command without
having delayed before escaping to SIMH context.
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 Escape Characters
## 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.
Several OS/8 programs expect an <kbd>Escape</kbd> (a.k.a. `ALTMODE`)
keystroke to do things. Examples are `TECO` and `FRTS`. There isn't a
specific method to do this because we can do that in terms of one we've
just described:

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
    s.os8_send_ctrl ('[')

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.
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.


```
  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`, but there's more to the class than that,
used by `teco-pi-demo`. It is a useful exercise to read through [the
primarily because the `os8-run` script's needs are broader.  Rather than
just recapitulate the class documentation here, please read through [the
class's source code][ssc], paying particular attention to the method
comments. It's a pretty simple class, making it a quick read.
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
[dsc]: https://tangentsoft.com/pidp8i/file/lib/pidp8i/dirs.py
[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-2019 by Warren Young. Licensed under the
terms of [the SIMH license][sl].
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
Added doc/dcp-wu.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                 |
Deleted doc/dcp_wu.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                 |
Added doc/e8-manual-pdf.css.













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;
}
Added doc/e8-manual.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
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:

![E8 text buffer memory layout diagram](graphics/e8-buffer.svg)

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
Added doc/graphics/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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
<?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>
Added doc/os8-combined-kit.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Changes to doc/os8-patching.md.
47
48
49
50
51
52
53
54

55
56
57
58

59
60
61
62

63
64
65
66

67
68
69
70
71
72

73
74
75
76
77
78

79
80
81
82
83
84
85
86
87

88
89
90
91
92
93
94
47
48
49
50
51
52
53

54
55
56
57

58
59
60
61

62
63
64
65

66
67
68
69
70
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.2O` is an optional patch which disables 8th bit parity. It
`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.3O` is an optional patch that enables 132 column
`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.1O` is an optional patch that permanently forces no case
`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.2O` is an optional patch that turns off verbose
`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.3O` turns off a warning that you are using the `YANK`
`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.4O` implements rubout support specifically and uniquely
`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.1M` shows:
`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
128

129
130
131
132
133
134
135
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.4M` is broken and doubly mis-labeled. Mis-label #1: It is
`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
233
234


235
236
237
238
239
240
241
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 `local.tu56` DECtape image along with the other local hacks.
The `v3d-rk05.os8` script has conditional code to replace `FORLIB.RL`
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
Added doc/os8-progtest.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Changes to doc/os8-run.md.
75
76
77
78
79
80
81
82
83

84
85
86
87
88

89
90
91
92
93
94
95
96
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
* copy files to the running OS/8 from the POSIX environment running SIMH.
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` with either a 3 argument form that produces a listing file,
* run `PAL8` and report any errors encountered.
or a 2 argument form that does not.
* 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
217

218
219
220
221
222
223
224
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
    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
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
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
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`

As explained above in the [Execution contexts](#contexts) section, we
can't just issue a SIMH `continue` command because we need some output
from OS/8 running within SIMH to re-synchronize Python expect to.
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.

After trying several different things that did not work, the least
disruptive action is to send `CTRL/C` and a newline with some keyboard
delays. The `resume` command does this.

The `resume` command checks to see if OS/8 has been booted and refuses
to act if it has not.
However, because the context switches are well-defined, the `resume`
command is completely optional in scripts.  Instead `os8-run`, when it
detects the need to return to OS/8 from SIMH command level, will issue
a `resume` command to force a context switch. 


### <a id="restart-comm"></a>`restart` — Restart OS/8.

`restart`

Equivalent to the SIMH command line of \"`go 7600`\".
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 does re-initilaize some state so it is more disruptive
than the `CTRL/C` resume documented above.
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
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
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
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
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.

Run `PAL8` with either a 3 argument form that produces a listing file,
or a 2 argument form that does not.

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 parsing
However, an separate pal8 command was created to enable richer display
of errors when no listing file is created.  This decision is currently
under review, and the `pal8` command may go away in a subsequent version
of `os8-run`.  For now, two forms of the `pal8` command are supported with
an unreasonable number of limitations:

of errors.
`pal8` _os8-bn-spec_ `<` _os8-pa-spec_

`pal8` _os8-bn-spec_ `,` _os8-ls-spec_ `<` _os8-pa-spec_

Note that the parser for this wrapper for `PAL8` is much too
conservative in what it allows:

* No `PAL8` options are allowed.
* Only two ways to call `PAL8`:
    * two argument form with binary and source or
    * three argument form with binary, listing, and source.
* _os8-bn-spec_ must specify a binary filename ending in `.BN`
* _os8-ls-spec_ must specify a listing filename ending in `.LS`
* _os8-pa-spec_ must specify a source filename ending in `.PA`

This should be improved.  The reason why this wrapper is so
constrained is that it evolved from extremely rudimentary, hard-coded
scripts, and hasn't been worked on since reaching minimum necessary
functionality.

The three file name specifiers can include an OS/8 device specification.

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
1021
1022
1023
1024
1025
1026
1027
1028
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

* Allow passing in of arguments to PAL8.
* 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

Added doc/os8pkg.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added doc/testing.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.
Changes to doc/uwfocal-manual-supp.md.
51
52
53
54
55
56
57
58
59
60
61






62
63
64
65
66
67
68

69
70
71
72
73
74
75
51
52
53
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&iuml;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. Currently, that won't work.
(2017.10.05) We believe it is because of the way U/W FOCAL handles
terminal I/O and interrupts. If you try, the input ends up trashed in
FOCAL.
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.
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
884

885
886
887
888
889
890
891
892

893
894
895
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/HACKERS.md#patches
[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 by Warren Young and Bill Cattey. Licensed under the
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
Changes to doc/uwfocal-manual.md.
2714
2715
2716
2717
2718
2719
2720
2721

2722
2723
2724
2725
2726
2727
2728
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> |
| 128  | `Ctrl/@`  | NULL | 160  | `SPACE` | 192  | `@`  | 224  | <code>&#96;</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
3042

3043
3044
3045
3046
3047
3048
3049
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/HACKERS.md
[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/

---------------------------
Added etc/pidp8i.rc.





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
Changes to etc/udev.rules.


1
2














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"
Added examples/host/class-os8script-demo.py.









































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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()
Deleted hardware/pdp8i/PDP8-cache.lib.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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





















































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
EESchema-LIBRARY Version 2.3  Date: 11/05/2015 22:48:50
#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_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
#
# CONN_3
#
DEF CONN_3 K 0 40 Y N 1 F N
F0 "K" -50 0 50 V V C CNN
F1 "CONN_3" 50 0 40 V V C CNN
F2 "~" 0 0 60 H V C CNN
F3 "~" 0 0 60 H V C CNN
DRAW
S -100 150 100 -150 0 1 0 N
X P1 1 -350 100 250 R 60 60 1 1 P I
X PM 2 -350 0 250 R 60 60 1 1 P I
X P3 3 -350 -100 250 R 60 60 1 1 P I
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
Deleted hardware/pdp8i/PDP8.cmp.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Cmp-Mod V01 Created by CvPcb (2013-07-07 BZR 4022)-stable date = 10/05/2015 13:43:50

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  = D3;
EndCmp

BeginCmp
TimeStamp = /554F46DF;
Reference = J_COL1;
ValeurCmp = CONN_3;
IdModule  = PIN_ARRAY_3X1;
EndCmp

BeginCmp
TimeStamp = /554F46EE;
Reference = J_COL2;
ValeurCmp = CONN_3;
IdModule  = PIN_ARRAY_3X1;
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 = /554E0D39;
Reference = P3;
ValeurCmp = EXPANSION_20X2;
IdModule  = PIN_ARRAY_20X2;
EndCmp

BeginCmp
TimeStamp = /554E5206;
Reference = P5;
ValeurCmp = SERIAL 5V TTL;
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 = /554E5219;
Reference = R_S1;
ValeurCmp = 300;
IdModule  = R3;
EndCmp

BeginCmp
TimeStamp = /554E5233;
Reference = R_S2;
ValeurCmp = 620;
IdModule  = R3;
EndCmp

BeginCmp
TimeStamp = /548EFBFD;
Reference = SW1;
ValeurCmp = DF1;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFC03;
Reference = SW2;
ValeurCmp = DF2;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFC09;
Reference = SW3;
ValeurCmp = DF3;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFC0F;
Reference = SW4;
ValeurCmp = IF1;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFC15;
Reference = SW5;
ValeurCmp = IF2;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFC1B;
Reference = SW6;
ValeurCmp = IF3;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFAF8;
Reference = SW7;
ValeurCmp = SR1;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB27;
Reference = SW8;
ValeurCmp = SR2;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB2D;
Reference = SW9;
ValeurCmp = SR3;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB33;
Reference = SW10;
ValeurCmp = SR4;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB42;
Reference = SW11;
ValeurCmp = SR5;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB48;
Reference = SW12;
ValeurCmp = SR6;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB4E;
Reference = SW13;
ValeurCmp = SR7;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB54;
Reference = SW14;
ValeurCmp = SR8;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB5A;
Reference = SW15;
ValeurCmp = SR9;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB60;
Reference = SW16;
ValeurCmp = SR10;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB66;
Reference = SW17;
ValeurCmp = SR11;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EFB6C;
Reference = SW18;
ValeurCmp = SR12;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EF86F;
Reference = SW19;
ValeurCmp = START;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EF87C;
Reference = SW20;
ValeurCmp = LOAD_ADD;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EF882;
Reference = SW21;
ValeurCmp = DEP;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EF888;
Reference = SW22;
ValeurCmp = EXAM;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EF88E;
Reference = SW23;
ValeurCmp = CONT;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EF894;
Reference = SW24;
ValeurCmp = STOP;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EF89A;
Reference = SW25;
ValeurCmp = SING_STEP;
IdModule  = SW_KND2_PDP2;
EndCmp

BeginCmp
TimeStamp = /548EF8A0;
Reference = SW26;
ValeurCmp = SING_INST;
IdModule  = SW_KND2_PDP2;
EndCmp

EndListe
Deleted hardware/pdp8i/PDP8.dsn.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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























































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
(pcb C:\temp29\PDP8KICAD\PDP8.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  8500 -64000  288500 -64000  288500 -163000  8500 -163000
            8500 -64000)
    )
    (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  9000 -142000  14000 -142000  14000 -140000  23000 -140000
            24000 -141000  24000 -162000  16000 -162000  16000 -157000  15000 -156000
            9000 -156000))
    (keepout "" (polygon F.Cu 0  9000 -142000  14000 -142000  14000 -140000  23000 -140000
            24000 -141000  24000 -162000  16000 -162000  16000 -157000  15000 -156000
            9000 -156000))
    (keepout "" (polygon F.Cu 0  64500 -111000  66500 -111000  66000 -111500  66000 -112000
            66000 -112500  65000 -112500  65250 -111750  65000 -111250  64500 -111000))
    (keepout "" (polygon F.Cu 0  65000 -114750  66000 -114750  66000 -115750  65000 -115750
            65250 -115250))
    (via "Via[0-1]_889:635_um" "Via[0-1]_889:0_um")
    (rule
      (width 254)
      (clearance 254.1)
      (clearance 254.1 (type default_smd))
      (clearance 63.5 (type smd_smd))
    )
  )
  (placement
    (component R3
      (place R9 57920 -102940 back 270 (PN 390))
      (place R1 37600 -102940 back 90 (PN 390))
      (place R2 40140 -102940 back 90 (PN 390))
      (place R3 42680 -102940 back 90 (PN 390))
      (place R4 45220 -102940 back 90 (PN 390))
      (place R5 47760 -102940 back 90 (PN 390))
      (place R6 50300 -102940 back 90 (PN 390))
      (place R7 52840 -102940 back 270 (PN 390))
      (place R8 55380 -102940 back 270 (PN 390))
      (place R10 60460 -102940 back 270 (PN 390))
      (place R11 63000 -102940 back 270 (PN 390))
      (place R12 65540 -102940 back 270 (PN 390))
      (place R_ROW1 78900 -133080 front 0 (PN 1K))
      (place R_ROW2 18750 -129500 front 180 (PN 1K))
      (place R_ROW3 218600 -133080 front 0 (PN 1K))
      (place R_S1 18750 -133000 front 0 (PN 300))
      (place R_S2 18750 -136500 front 0 (PN 620))
    )
    (component "DIP-18__300"
      (place P2 219050 -100970 back 270 (PN UDN2981A))
    )
    (component 1pin
      (place M1 13000 -68000 front 0 (PN M))
      (place M2 13000 -159000 front 0 (PN M))
      (place M3 285000 -68000 front 0 (PN M))
      (place M4 286000 -159000 front 0 (PN M))
      (place M5 208000 -68000 front 0 (PN M))
      (place M6 285000 -132000 front 0 (PN M))
      (place M7 208000 -132000 front 0 (PN M))
    )
    (component D2
      (place D23 249000 -136500 front 0 (PN 1N4148))
      (place D24 259000 -136500 front 0 (PN 1N4148))
      (place D22 239000 -136500 front 0 (PN 1N4148))
      (place D25 269000 -136500 front 0 (PN 1N4148))
      (place D26 279000 -136500 front 0 (PN 1N4148))
      (place D12 139000 -136500 front 0 (PN 1N4148))
      (place D2 39000 -136500 front 0 (PN 1N4148))
      (place D3 49000 -136500 front 0 (PN 1N4148))
      (place D4 59000 -136500 front 0 (PN 1N4148))
      (place D5 69000 -136500 front 0 (PN 1N4148))
      (place D6 79000 -136500 front 0 (PN 1N4148))
      (place D7 89000 -136500 front 0 (PN 1N4148))
      (place D8 99000 -136500 front 0 (PN 1N4148))
      (place D9 109000 -136500 front 0 (PN 1N4148))
      (place D10 119000 -136500 front 0 (PN 1N4148))
      (place D11 129000 -136500 front 0 (PN 1N4148))
      (place D1 29000 -136500 front 0 (PN 1N4148))
      (place D13 149000 -136500 front 0 (PN 1N4148))
      (place D14 159000 -136500 front 0 (PN 1N4148))
      (place D15 169000 -136500 front 0 (PN 1N4148))
      (place D16 179000 -136500 front 0 (PN 1N4148))
      (place D17 189000 -136500 front 0 (PN 1N4148))
      (place D18 199000 -136500 front 0 (PN 1N4148))
      (place D19 209000 -136500 front 0 (PN 1N4148))
      (place D20 219000 -136500 front 0 (PN 1N4148))
      (place D21 229000 -136500 front 0 (PN 1N4148))
    )
    (component RASPI_BPLUS_MIRRORED
      (place P1 64000 -124000 back 0 (PN RASPI_MODEL_B_PLUS_GPIO))
    )
    (component D3
      (place DZ1 219000 -117000 front 0 (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 -121700 front 0 (PN LED))
      (place DIOT1 239000 -114400 front 0 (PN LED))
      (place DJMP1 239000 -107100 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 SW_KND2_PDP2
      (place SW6 79000 -159500 front 0 (PN IF3))
      (place SW5 69000 -159500 front 0 (PN IF2))
      (place SW4 59000 -159500 front 0 (PN IF1))
      (place SW3 49000 -159500 front 0 (PN DF3))
      (place SW2 39000 -159500 front 0 (PN DF2))
      (place SW1 29000 -159500 front 0 (PN DF1))
      (place SW18 199000 -159500 front 0 (PN SR12))
      (place SW17 189000 -159500 front 0 (PN SR11))
      (place SW15 169000 -159500 front 0 (PN SR9))
      (place SW14 159000 -159500 front 0 (PN SR8))
      (place SW13 149000 -159500 front 0 (PN SR7))
      (place SW12 139000 -159500 front 0 (PN SR6))
      (place SW19 209000 -159500 front 0 (PN START))
      (place SW20 219000 -159500 front 0 (PN LOAD_ADD))
      (place SW16 179000 -159500 front 0 (PN SR10))
      (place SW22 239000 -159500 front 0 (PN EXAM))
      (place SW23 249000 -159500 front 0 (PN CONT))
      (place SW24 259000 -159500 front 0 (PN STOP))
      (place SW25 269000 -159500 front 0 (PN SING_STEP))
      (place SW26 279000 -159500 front 0 (PN SING_INST))
      (place SW7 89000 -159500 front 0 (PN SR1))
      (place SW8 99000 -159500 front 0 (PN SR2))
      (place SW9 109000 -159500 front 0 (PN SR3))
      (place SW10 119000 -159500 front 0 (PN SR4))
      (place SW11 129000 -159500 front 0 (PN SR5))
      (place SW21 229000 -159500 front 0 (PN DEP))
    )
    (component PIN_ARRAY_4x1
      (place P5 11500 -136000 front 270 (PN "SERIAL 5V TTL"))
    )
    (component PIN_ARRAY_20X2
      (place P3 253900 -130050 back 180 (PN EXPANSION_20X2))
    )
    (component "LED-3-StrEight"
      (place DPAUSE2 259000 -114400 front 0 (PN LED))
      (place DRUN2 259000 -121700 front 0 (PN LED))
    )
    (component PIN_ARRAY_3X1
      (place J_COL1 64300 -111800 back 180 (PN CONN_3))
      (place J_COL2 64300 -115200 back 180 (PN CONN_3))
    )
  )
  (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 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_5700_um H2 -29000 0)
      (pin Round[A]Pad_5700_um H3 29000 0)
      (pin Round[A]Pad_5700_um H4 29000 49000)
      (pin Round[A]Pad_5700_um H1 -29000 49000)
    )
    (image D3
      (outline (path signal 304.8  3810 0  3048 0))
      (outline (path signal 304.8  3048 0  3048 1016))
      (outline (path signal 304.8  3048 1016  -3048 1016))
      (outline (path signal 304.8  -3048 1016  -3048 0))
      (outline (path signal 304.8  -3048 0  -3810 0))
      (outline (path signal 304.8  -3048 0  -3048 -1016))
      (outline (path signal 304.8  -3048 -1016  3048 -1016))
      (outline (path signal 304.8  3048 -1016  3048 0))
      (outline (path signal 304.8  2540 1016  2540 -1016))
      (outline (path signal 304.8  2286 -1016  2286 1016))
      (pin Rect[A]Pad_1397x1397_um 2 3810 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 SW_KND2_PDP2
      (outline (path signal 150  -4750 -1950  -4750 10350))
      (outline (path signal 150  4750 10300  4750 -1950))
      (outline (path signal 150  -4750 -1958  4750 -1958))
      (outline (path signal 150  -4750 10300  -4750 18900))
      (outline (path signal 150  4750 10300  4750 18900))
      (outline (path signal 150  4750 18900  -4750 18900))
      (outline (path signal 150  4750 10300  -4750 10300))
      (pin Oval[A]Pad_5080x2540_um 1 0 0)
      (pin Oval[A]Pad_5080x2540_um 2 0 5580)
      (pin Round[A]Pad_4000_um 3 0 15000)
    )
    (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 PIN_ARRAY_20X2
      (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)
    )
    (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 PIN_ARRAY_3X1
      (outline (path signal 152.4  -3810 -1270  -3810 1270))
      (outline (path signal 152.4  -3810 1270  3810 1270))
      (outline (path signal 152.4  3810 1270  3810 -1270))
      (outline (path signal 152.4  3810 -1270  -3810 -1270))
      (outline (path signal 152.4  -1270 1270  -1270 -1270))
      (pin Rect[A]Pad_1524x1524_um 1 -2540 0)
      (pin Round[A]Pad_1524_um 2 0 0)
      (pin Round[A]Pad_1524_um 3 2540 0)
    )
    (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_4000_um
      (shape (circle F.Cu 4000))
      (shape (circle B.Cu 4000))
      (attach off)
    )
    (padstack Round[A]Pad_4064_um
      (shape (circle F.Cu 4064))
      (shape (circle B.Cu 4064))
      (attach off)
    )
    (padstack Round[A]Pad_5700_um
      (shape (circle F.Cu 5700))
      (shape (circle B.Cu 5700))
      (attach off)
    )
    (padstack Oval[A]Pad_5080x2540_um
      (shape (path F.Cu 2540  -1270 0  1270 0))
      (shape (path B.Cu 2540  -1270 0  1270 0))
      (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-6 P3-5)
    )
    (net +5V
      (pins P1-2 P1-4 DZ1-1 P5-2 P3-1 P3-2)
    )
    (net GND
      (pins P2-10 P1-6 P1-20 P1-9 P1-39 P1-30 R_S2-1 P5-1 P3-8 P3-7)
    )
    (net "N-0000023"
      (pins P2-9 DZ1-2)
    )
    (net "N-0000028"
      (pins R1-2 J_COL1-2)
    )
    (net "N-0000029"
      (pins R2-2 J_COL2-2)
    )
    (net "N-0000035"
      (pins R_S1-1 R_S2-2 P5-3)
    )
    (net "N-0000039"
      (pins R6-2 P1-26)
    )
    (net "N-0000040"
      (pins R10-1 P1-23)
    )
    (net "N-0000041"
      (pins R_ROW1-1 P1-36)
    )
    (net "N-0000042"
      (pins R11-1 P1-32)
    )
    (net "N-0000043"
      (pins R7-1 P1-24)
    )
    (net "N-0000046"
      (pins R_ROW3-1 P1-12)
    )
    (net "N-0000048"
      (pins R12-1 P1-33)
    )
    (net "N-0000049"
      (pins R5-2 P1-31)
    )
    (net "N-0000050"
      (pins R4-2 P1-29)
    )
    (net "N-0000053"
      (pins D6-2 SW6-2)
    )
    (net "N-0000054"
      (pins R8-1 P1-21)
    )
    (net "N-0000055"
      (pins R9-1 P1-19)
    )
    (net "N-0000056"
      (pins R_ROW2-1 P1-11)
    )
    (net "N-0000057"
      (pins R3-2 P1-7)
    )
    (net "N-0000059"
      (pins D5-2 SW5-2)
    )
    (net "N-0000060"
      (pins D4-2 SW4-2)
    )
    (net "N-0000061"
      (pins D3-2 SW3-2)
    )
    (net "N-0000062"
      (pins D2-2 SW2-2)
    )
    (net "N-0000063"
      (pins D1-2 SW1-2)
    )
    (net "N-0000065"
      (pins D22-2 SW22-2)
    )
    (net "N-0000066"
      (pins D23-2 SW23-2)
    )
    (net "N-0000067"
      (pins D24-2 SW24-2)
    )
    (net "N-0000068"
      (pins D25-2 SW25-2)
    )
    (net "N-0000069"
      (pins D26-2 SW26-2)
    )
    (net "N-0000070"
      (pins D21-2 SW21-2)
    )
    (net "N-0000071"
      (pins D7-2 SW7-2)
    )
    (net "N-0000072"
      (pins D8-2 SW8-2)
    )
    (net "N-0000073"
      (pins D9-2 SW9-2)
    )
    (net "N-0000074"
      (pins D10-2 SW10-2)
    )
    (net "N-0000079"
      (pins D11-2 SW11-2)
    )
    (net "N-0000085"
      (pins D19-2 SW19-2)
    )
    (net "N-0000086"
      (pins D20-2 SW20-2)
    )
    (net "N-0000087"
      (pins D12-2 SW12-2)
    )
    (net "N-0000088"
      (pins D13-2 SW13-2)
    )
    (net "N-0000089"
      (pins D14-2 SW14-2)
    )
    (net "N-0000090"
      (pins D15-2 SW15-2)
    )
    (net "N-0000091"
      (pins D16-2 SW16-2)
    )
    (net "N-0000092"
      (pins D17-2 SW17-2)
    )
    (net "N-0000093"
      (pins D18-2 SW18-2)
    )
    (net RX
      (pins P1-10 R_S1-2 J_COL2-3)
    )
    (net SPARE_IO
      (pins P1-35 P3-15 P3-16)
    )
    (net TX
      (pins P1-8 P5-4 J_COL1-3)
    )
    (net col1
      (pins R1-1 D7-1 D1-1 D19-1 DAC1-2 DPC1-2 DMQ1-2 DMA1-2 DMB1-2 DCURAD1-2 DDF1-2
        DAND1-2 P3-17 P3-18)
    )
    (net col10
      (pins R10-2 D16-1 DMB10-2 DAC10-2 DMQ10-2 DPC10-2 DMA10-2 DEXEC1-2 DSC5-2 P3-36
        P3-35)
    )
    (net col11
      (pins R11-2 D17-1 DMB11-2 DMQ11-2 DAC11-2 DPC11-2 DMA11-2 DDEFER1-2 P3-38 P3-37)
    )
    (net col12
      (pins R12-2 D18-1 DMB12-2 DAC12-2 DMQ12-2 DPC12-2 DMA12-2 DWRDCT1-2 P3-39 P3-40)
    )
    (net col1a
      (pins P1-3 J_COL1-1)
    )
    (net col2
      (pins R2-1 D2-1 D8-1 D20-1 DAC2-2 DMQ2-2 DPC2-2 DMA2-2 DMB2-2 DBREAK1-2 DDF2-2
        DTAD1-2 P3-19 P3-20)
    )
    (net col2a
      (pins P1-5 J_COL2-1)
    )
    (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 P3-21 P3-22)
    )
    (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 P3-23 P3-24 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 P3-25 P3-26 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 P3-27 P3-28)
    )
    (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
        P3-29 P3-30)
    )
    (net col8
      (pins R8-2 D26-1 D14-1 DAC8-2 DMQ8-2 DPC8-2 DMB8-2 DMA8-2 DOPR1-2 DSC3-2 P3-31
        P3-32)
    )
    (net col9
      (pins R9-2 D15-1 DMB9-2 DAC9-2 DMQ9-2 DPC9-2 DMA9-2 DFETCH1-2 DSC4-2 P3-33 P3-34)
    )
    (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 P3-10 P3-9 DPAUSE2-1 DRUN2-1)
    )
    (net led8
      (pins P2-11 DLINK1-1 DDF1-1 DDF2-1 DDF3-1 DIF2-1 DIF3-1 DIF1-1 P3-11 P3-12)
    )
    (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 P3-13 P3-14)
    )
    (net row3
      (pins R_ROW3-2 SW19-1 SW20-1 SW22-1 SW23-1 SW24-1 SW25-1 SW26-1 SW21-1)
    )
    (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 "" +3.3V +5V GND "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 row1 row2 row3 xled1 xled2 xled3
      xled4 xled5 xled6 xled7 xled8
      (circuit
        (use_via Via[0-1]_889:635_um)
      )
      (rule
        (width 254)
        (clearance 254.1)
      )
    )
  )
  (wiring
  )
)
Deleted hardware/pdp8i/PDP8.kicad_pcb.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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




















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
(kicad_pcb (version 3) (host pcbnew "(2013-07-07 BZR 4022)-stable")

  (general
    (links 343)
    (no_connects 0)
    (area 8.0964 63.949999 288.550001 163.050001)
    (thickness 1.6)
    (drawings 11)
    (tracks 1226)
    (zones 0)
    (modules 174)
    (nets 80)
  )

  (page A4)
  (layers
    (15 F.Cu signal)
    (0 B.Cu signal)
    (16 B.Adhes user hide)
    (17 F.Adhes user hide)
    (18 B.Paste user hide)
    (19 F.Paste user hide)
    (20 B.SilkS user hide)
    (21 F.SilkS user)
    (22 B.Mask user hide)
    (23 F.Mask user hide)
    (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.254)
    (trace_clearance 0.254)
    (zone_clearance 0.508)
    (zone_45_only no)
    (trace_min 0.254)
    (segment_width 0.2)
    (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.15)
    (mod_text_size 1 1)
    (mod_text_width 0.15)
    (pad_size 5.08 2.54)
    (pad_drill 3.45)
    (pad_to_mask_clearance 0)
    (aux_axis_origin 0 0)
    (visible_elements 7FFFEB31)
    (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 gerber/))
  )

  (net 0 "")
  (net 1 +3.3V)
  (net 2 +5V)
  (net 3 GND)
  (net 4 N-0000029)
  (net 5 N-0000036)
  (net 6 N-0000037)
  (net 7 N-0000038)
  (net 8 N-0000039)
  (net 9 N-0000040)
  (net 10 N-0000041)
  (net 11 N-0000043)
  (net 12 N-0000044)
  (net 13 N-0000045)
  (net 14 N-0000047)
  (net 15 N-0000048)
  (net 16 N-0000049)
  (net 17 N-0000050)
  (net 18 N-0000051)
  (net 19 N-0000052)
  (net 20 N-0000053)
  (net 21 N-0000055)
  (net 22 N-0000056)
  (net 23 N-0000057)
  (net 24 N-0000059)
  (net 25 N-0000062)
  (net 26 N-0000063)
  (net 27 N-0000064)
  (net 28 N-0000065)
  (net 29 N-0000066)
  (net 30 N-0000067)
  (net 31 N-0000068)
  (net 32 N-0000074)
  (net 33 N-0000080)
  (net 34 N-0000081)
  (net 35 N-0000082)
  (net 36 N-0000083)
  (net 37 N-0000084)
  (net 38 N-0000085)
  (net 39 N-0000086)
  (net 40 N-0000087)
  (net 41 N-0000088)
  (net 42 N-0000089)
  (net 43 N-0000090)
  (net 44 RX)
  (net 45 SPARE_IO)
  (net 46 TX)
  (net 47 col1)
  (net 48 col10)
  (net 49 col11)
  (net 50 col12)
  (net 51 col1a)
  (net 52 col2)
  (net 53 col2a)
  (net 54 col3)
  (net 55 col4)
  (net 56 col5)
  (net 57 col6)
  (net 58 col7)
  (net 59 col8)
  (net 60 col9)
  (net 61 led1)
  (net 62 led2)
  (net 63 led3)
  (net 64 led4)
  (net 65 led5)
  (net 66 led6)
  (net 67 led7)
  (net 68 led8)
  (net 69 row1)
  (net 70 row2)
  (net 71 row3)
  (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.254)
    (via_dia 0.889)
    (via_drill 0.635)
    (uvia_dia 0.508)
    (uvia_drill 0.127)
    (add_net "")
    (add_net +3.3V)
    (add_net +5V)
    (add_net GND)
    (add_net N-0000029)
    (add_net N-0000036)
    (add_net N-0000037)
    (add_net N-0000038)
    (add_net N-0000039)
    (add_net N-0000040)
    (add_net N-0000041)
    (add_net N-0000043)
    (add_net N-0000044)
    (add_net N-0000045)
    (add_net N-0000047)
    (add_net N-0000048)
    (add_net N-0000049)
    (add_net N-0000050)
    (add_net N-0000051)
    (add_net N-0000052)
    (add_net N-0000053)
    (add_net N-0000055)
    (add_net N-0000056)
    (add_net N-0000057)
    (add_net N-0000059)
    (add_net N-0000062)
    (add_net N-0000063)
    (add_net N-0000064)
    (add_net N-0000065)
    (add_net N-0000066)
    (add_net N-0000067)
    (add_net N-0000068)
    (add_net N-0000074)
    (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-0000086)
    (add_net N-0000087)
    (add_net N-0000088)
    (add_net N-0000089)
    (add_net N-0000090)
    (add_net RX)
    (add_net SPARE_IO)
    (add_net TX)
    (add_net col1)
    (add_net col10)
    (add_net col11)
    (add_net col12)
    (add_net col1a)
    (add_net col2)
    (add_net col2a)
    (add_net col3)
    (add_net col4)
    (add_net col5)
    (add_net col6)
    (add_net col7)
    (add_net col8)
    (add_net col9)
    (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 row1)
    (add_net row2)
    (add_net row3)
    (add_net xled1)
    (add_net xled2)
    (add_net xled3)
    (add_net xled4)
    (add_net xled5)
    (add_net xled6)
    (add_net xled7)
    (add_net xled8)
  )

  (module D3 (layer B.Cu) (tedit 5551184A) (tstamp 54BD7076)
    (at 219 117)
    (descr "Diode 3 pas")
    (tags "DIODE DEV")
    (path /54BD85A3)
    (fp_text reference DZ1 (at 0 0) (layer B.SilkS) hide
      (effects (font (size 1.016 1.016) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value ZENER (at 0 0) (layer B.SilkS) hide
      (effects (font (size 1.016 1.016) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.048 0) (end 3.048 0) (layer B.SilkS) (width 0.3048))
    (fp_line (start 3.81 0) (end 3.048 0) (layer B.SilkS) (width 0.3048))
    (fp_line (start -3.048 0) (end -3.81 0) (layer B.SilkS) (width 0.3048))
    (pad 2 thru_hole rect (at 3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 2 +5V)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.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 R3 (layer B.Cu) (tedit 4E4C0E65) (tstamp 54B17F96)
    (at 57.92 102.94 90)
    (descr "Resitance 3 pas")
    (tags R)
    (path /54908374)
    (autoplace_cost180 10)
    (fp_text reference R9 (at 0 -0.127 90) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 90) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 19 N-0000052)
    )
    (pad 2 thru_hole circle (at 3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 60 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 B.Cu) (tedit 4E4C0E65) (tstamp 54B17F87)
    (at 37.6 102.94 270)
    (descr "Resitance 3 pas")
    (tags R)
    (path /5490833D)
    (autoplace_cost180 10)
    (fp_text reference R1 (at 0 -0.127 270) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 270) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 47 col1)
    )
    (pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 46 TX)
    )
    (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 B.Cu) (tedit 4E4C0E65) (tstamp 54B17F67)
    (at 40.14 102.94 270)
    (descr "Resitance 3 pas")
    (tags R)
    (path /5490834A)
    (autoplace_cost180 10)
    (fp_text reference R2 (at 0 -0.127 270) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 270) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 52 col2)
    )
    (pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 44 RX)
    )
    (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 B.Cu) (tedit 4E4C0E65) (tstamp 54B17C46)
    (at 42.68 102.94 270)
    (descr "Resitance 3 pas")
    (tags R)
    (path /54908350)
    (autoplace_cost180 10)
    (fp_text reference R3 (at 0 -0.127 270) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 270) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 54 col3)
    )
    (pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 20 N-0000053)
    )
    (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 B.Cu) (tedit 4E4C0E65) (tstamp 54B17C54)
    (at 45.22 102.94 270)
    (descr "Resitance 3 pas")
    (tags R)
    (path /54908356)
    (autoplace_cost180 10)
    (fp_text reference R4 (at 0 -0.127 270) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 270) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 55 col4)
    )
    (pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 17 N-0000050)
    )
    (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 B.Cu) (tedit 4E4C0E65) (tstamp 54B17C62)
    (at 47.76 102.94 270)
    (descr "Resitance 3 pas")
    (tags R)
    (path /5490835C)
    (autoplace_cost180 10)
    (fp_text reference R5 (at 0 -0.127 270) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 270) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 56 col5)
    )
    (pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 16 N-0000049)
    )
    (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 B.Cu) (tedit 4E4C0E65) (tstamp 54B17C70)
    (at 50.3 102.94 270)
    (descr "Resitance 3 pas")
    (tags R)
    (path /54908362)
    (autoplace_cost180 10)
    (fp_text reference R6 (at 0 -0.127 270) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 270) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 57 col6)
    )
    (pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 5 N-0000036)
    )
    (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 B.Cu) (tedit 4E4C0E65) (tstamp 54B17C7E)
    (at 52.84 102.94 90)
    (descr "Resitance 3 pas")
    (tags R)
    (path /54908368)
    (autoplace_cost180 10)
    (fp_text reference R7 (at 0 -0.127 90) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 90) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 9 N-0000040)
    )
    (pad 2 thru_hole circle (at 3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 58 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 B.Cu) (tedit 4E4C0E65) (tstamp 54B17C8C)
    (at 55.38 102.94 90)
    (descr "Resitance 3 pas")
    (tags R)
    (path /5490836E)
    (autoplace_cost180 10)
    (fp_text reference R8 (at 0 -0.127 90) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 90) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 18 N-0000051)
    )
    (pad 2 thru_hole circle (at 3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 59 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 B.Cu) (tedit 4E4C0E65) (tstamp 54B1C0BD)
    (at 60.46 102.94 90)
    (descr "Resitance 3 pas")
    (tags R)
    (path /5490837A)
    (autoplace_cost180 10)
    (fp_text reference R10 (at 0 -0.127 90) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 90) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 6 N-0000037)
    )
    (pad 2 thru_hole circle (at 3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 48 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 B.Cu) (tedit 4E4C0E65) (tstamp 54B17CA8)
    (at 63 102.94 90)
    (descr "Resitance 3 pas")
    (tags R)
    (path /54908380)
    (autoplace_cost180 10)
    (fp_text reference R11 (at 0 -0.127 90) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 90) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 8 N-0000039)
    )
    (pad 2 thru_hole circle (at 3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 49 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 B.Cu) (tedit 4E4C0E65) (tstamp 54B17CB6)
    (at 65.54 102.94 90)
    (descr "Resitance 3 pas")
    (tags R)
    (path /54908386)
    (autoplace_cost180 10)
    (fp_text reference R12 (at 0 -0.127 90) (layer B.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_text value 390 (at 0 -0.127 90) (layer B.SilkS)
      (effects (font (size 1.397 1.27) (thickness 0.2032)) (justify mirror))
    )
    (fp_line (start -3.81 0) (end -3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.81 0) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 0) (end 3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 1.016) (end -3.302 1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 1.016) (end -3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 -1.016) (end 3.302 -1.016) (layer B.SilkS) (width 0.2032))
    (fp_line (start 3.302 -1.016) (end 3.302 0) (layer B.SilkS) (width 0.2032))
    (fp_line (start -3.302 0.508) (end -2.794 1.016) (layer B.SilkS) (width 0.2032))
    (pad 1 thru_hole circle (at -3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 15 N-0000048)
    )
    (pad 2 thru_hole circle (at 3.81 0 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 50 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 54B17CC4)
    (at 78.9 133.08)
    (descr "Resitance 3 pas")
    (tags R)
    (path /5490838C)
    (autoplace_cost180 10)
    (fp_text reference R_ROW1 (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 7 N-0000038)
    )
    (pad 2 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 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 18.75 129.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 14 N-0000047)
    )
    (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 70 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 54B17CE0)
    (at 218.6 133.08)
    (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 10 N-0000041)
    )
    (pad 2 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 71 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 B.Cu) (tedit 200000) (tstamp 54B17CFD)
    (at 219.05 100.97 90)
    (descr "8 pins DIL package, round pads")
    (path /54B17386)
    (fp_text reference P2 (at -7.62 1.27 90) (layer B.SilkS)
      (effects (font (size 1.778 1.143) (thickness 0.3048)) (justify mirror))
    )
    (fp_text value UDN2981A (at 5.08 -1.27 90) (layer B.SilkS)
      (effects (font (size 1.778 1.143) (thickness 0.3048)) (justify mirror))
    )
    (fp_line (start -12.7 1.27) (end -11.43 1.27) (layer B.SilkS) (width 0.381))
    (fp_line (start -11.43 1.27) (end -11.43 -1.27) (layer B.SilkS) (width 0.381))
    (fp_line (start -11.43 -1.27) (end -12.7 -1.27) (layer B.SilkS) (width 0.381))
    (fp_line (start -12.7 2.54) (end 12.7 2.54) (layer B.SilkS) (width 0.381))
    (fp_line (start 12.7 2.54) (end 12.7 -2.54) (layer B.SilkS) (width 0.381))
    (fp_line (start 12.7 -2.54) (end -12.7 -2.54) (layer B.SilkS) (width 0.381))
    (fp_line (start -12.7 -2.54) (end -12.7 2.54) (layer B.SilkS) (width 0.381))
    (pad 1 thru_hole rect (at -10.16 -3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 72 xled1)
    )
    (pad 2 thru_hole circle (at -7.62 -3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 73 xled2)
    )
    (pad 3 thru_hole circle (at -5.08 -3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 74 xled3)
    )
    (pad 4 thru_hole circle (at -2.54 -3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 75 xled4)
    )
    (pad 5 thru_hole circle (at 0 -3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 76 xled5)
    )
    (pad 6 thru_hole circle (at 2.54 -3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 77 xled6)
    )
    (pad 7 thru_hole circle (at 5.08 -3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 78 xled7)
    )
    (pad 8 thru_hole circle (at 7.62 -3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 79 xled8)
    )
    (pad 9 thru_hole circle (at 10.16 -3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 2 +5V)
    )
    (pad 10 thru_hole circle (at 10.16 3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 3 GND)
    )
    (pad 11 thru_hole circle (at 7.62 3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 68 led8)
    )
    (pad 12 thru_hole circle (at 5.08 3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 67 led7)
    )
    (pad 13 thru_hole circle (at 2.54 3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 66 led6)
    )
    (pad 14 thru_hole circle (at 0 3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 65 led5)
    )
    (pad 15 thru_hole circle (at -2.54 3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 64 led4)
    )
    (pad 16 thru_hole circle (at -5.08 3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 63 led3)
    )
    (pad 17 thru_hole circle (at -7.62 3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 62 led2)
    )
    (pad 18 thru_hole circle (at -10.16 3.81 90) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask B.SilkS)
      (net 61 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 13.5 68)
    (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 554E4F5F)
    (at 13.5 159)
    (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 284.5 68)
    (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 54B1C866)
    (at 285.5 159)
    (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 54B17F78)
    (at 249 136.5)
    (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 29 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 56 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 54B17D1D)
    (at 259 136.5)
    (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 30 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 57 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 54B17D2D)
    (at 239 136.5)
    (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 28 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 55 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 54B17D3D)
    (at 269 136.5)
    (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 31 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 58 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 54B17D4D)
    (at 279 136.5)
    (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 24 N-0000059)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 59 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 136.5)
    (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 38 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 57 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 136.5)
    (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 11 N-0000043)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 52 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 136.5)
    (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 13 N-0000045)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 54 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 136.5)
    (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 23 N-0000057)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 55 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 136.5)
    (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 22 N-0000056)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 56 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 136.5)
    (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 21 N-0000055)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 57 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 136.5)
    (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 32 N-0000074)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 47 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 136.5)
    (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 34 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 52 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 136.5)
    (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 35 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 54 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 136.5)
    (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 36 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 55 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 136.5)
    (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 37 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 56 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 136.5)
    (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 12 N-0000044)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 47 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 136.5)
    (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 39 N-0000086)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 58 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 136.5)
    (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 40 N-0000087)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 59 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 136.5)
    (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 41 N-0000088)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 60 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 136.5)
    (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 33 N-0000080)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 48 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 136.5)
    (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 42 N-0000089)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 49 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 136.5)
    (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 43 N-0000090)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 50 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 54B17E7D)
    (at 209 136.5)
    (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 25 N-0000062)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 47 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 54B17E8D)
    (at 219 136.5)
    (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 26 N-0000063)
    )
    (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 52 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 54B17E9D)
    (at 229 136.5)
    (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 27 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 54 col3)
    )
    (model discret/diode.wrl
      (at (xyz 0 0 0))
      (scale (xyz 0.3 0.3 0.3))
      (rotate (xyz 0 0 0))
    )
  )

  (module RASPI_BPLUS_MIRRORED (layer B.Cu) (tedit 54BD7BC3) (tstamp 54B1C6FA)
    (at 64 124 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 40.5 180) (layer B.SilkS)
      (effects (font (size 1 1) (thickness 0.15)) (justify mirror))
    )
    (fp_text user "RASPI B PLUS (MIRROR IMAGE)" (at 7.5 43 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 14 N-0000047)
    )
    (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 46 TX)
    )
    (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 44 RX)
    )
    (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 19 N-0000052)
    )
    (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 10 N-0000041)
    )
    (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 18 N-0000051)
    )
    (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 6 N-0000037)
    )
    (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 17 N-0000050)
    )
    (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 16 N-0000049)
    )
    (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 9 N-0000040)
    )
    (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 5 N-0000036)
    )
    (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 15 N-0000048)
    )
    (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 8 N-0000039)
    )
    (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 7 N-0000038)
    )
    (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)
      (net 45 SPARE_IO)
    )
    (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 51 col1a)
    )
    (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 53 col2a)
    )
    (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 20 N-0000053)
    )
    (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 3 GND)
    )
    (pad 39 thru_hole circle (at 24.13 1.27 180) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 3 GND)
    )
    (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)
      (net 3 GND)
    )
    (pad H2 thru_hole circle (at -29 0 180) (size 5.7 5.7) (drill 2.75)
      (layers *.Cu *.Mask B.SilkS)
    )
    (pad H3 thru_hole circle (at 29 0 180) (size 5.7 5.7) (drill 2.75)
      (layers *.Cu *.Mask B.SilkS)
    )
    (pad H4 thru_hole circle (at 29 49 180) (size 5.7 5.7) (drill 2.75)
      (layers *.Cu *.Mask B.SilkS)
    )
    (pad H1 thru_hole circle (at -29 49 180) (size 5.7 5.7) (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 1pin (layer F.Cu) (tedit 200000) (tstamp 54BD0940)
    (at 208 68)
    (descr "module 1 pin (ou trou mecanique de percage)")
    (tags DEV)
    (path /54BD36C6)
    (fp_text reference M5 (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 54BD0946)
    (at 284.5 132)
    (descr "module 1 pin (ou trou mecanique de percage)")
    (tags DEV)
    (path /54BD36CC)
    (fp_text reference M6 (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 54BD094C)
    (at 208 132)
    (descr "module 1 pin (ou trou mecanique de percage)")
    (tags DEV)
    (path /54BD36D2)
    (fp_text reference M7 (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 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 63 led3)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 60 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 63 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 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 63 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 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 63 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 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 64 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 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 64 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 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 64 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 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 64 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 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 64 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 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 64 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 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 64 led4)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 58 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 64 led4)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 59 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 64 led4)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 60 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 64 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 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 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)
      (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 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 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 64 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 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 65 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 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 65 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 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 65 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 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 65 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 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 65 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 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 65 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 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 65 led5)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 58 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 65 led5)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 59 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 65 led5)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 60 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 65 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 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 65 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 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 65 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 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 68 led8)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 58 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 67 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 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 64 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 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 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)
      (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 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 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 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)
      (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 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 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 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)
      (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 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 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 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)
      (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 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 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 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)
      (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 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 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 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)
      (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 led1)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 58 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 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)
      (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 led1)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 59 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 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)
      (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 led1)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 60 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 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)
      (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 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 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 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)
      (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 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 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 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)
      (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 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 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 62 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 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 62 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 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 62 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 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 63 led3)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 59 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 62 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 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 62 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 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 62 led2)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 58 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 62 led2)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 59 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 62 led2)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 60 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 62 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 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 62 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 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 62 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 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 63 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 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 63 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 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 63 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 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 63 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 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 63 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 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 63 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 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 63 led3)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 58 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 62 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 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 67 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 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 67 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 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 67 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 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 67 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 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 67 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 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 66 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 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 66 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 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 66 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 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 66 led6)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 60 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.7)
    (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 66 led6)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 59 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.4)
    (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 66 led6)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 58 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.1)
    (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 66 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 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 66 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 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 66 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 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 67 led7)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 58 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 67 led7)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 60 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 67 led7)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 48 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 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)
      (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 68 led8)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 47 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 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)
      (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 68 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 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 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)
      (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 68 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 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 67 led7)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 59 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 66 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 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 66 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 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 66 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 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 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)
      (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 68 led8)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 56 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 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)
      (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 68 led8)
    )
    (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 57 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 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)
      (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 68 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 col4)
    )
    (model discret/leds/led3_vertical_verde.wrl
      (at (xyz 0 0 0))
      (scale (xyz 1 1 1))
      (rotate (xyz 0 0 0))
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F19EA)
    (at 79 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 70 row2)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 21 N-0000055)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F19D9)
    (at 69 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 70 row2)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 22 N-0000056)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F19C8)
    (at 59 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 70 row2)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 23 N-0000057)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F19B7)
    (at 49 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 70 row2)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 13 N-0000045)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F19A6)
    (at 39 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 70 row2)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 11 N-0000043)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1995)
    (at 29 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 70 row2)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 12 N-0000044)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1984)
    (at 199 159.5)
    (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 SR12 (at -0.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 43 N-0000090)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1973)
    (at 189 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 42 N-0000089)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1962)
    (at 169 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 41 N-0000088)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1951)
    (at 159 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 40 N-0000087)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1940)
    (at 149 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 39 N-0000086)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F192F)
    (at 139 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 38 N-0000085)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F191E)
    (at 209 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 71 row3)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 25 N-0000062)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F190D)
    (at 219 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 71 row3)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 26 N-0000063)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F18FC)
    (at 179 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 33 N-0000080)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F18EB)
    (at 239 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 71 row3)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 28 N-0000065)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F18DA)
    (at 249 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 71 row3)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 29 N-0000066)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F18C9)
    (at 259 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 71 row3)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 30 N-0000067)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F18B8)
    (at 269 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 71 row3)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 31 N-0000068)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F18A7)
    (at 279 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 71 row3)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 24 N-0000059)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1896)
    (at 89 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 32 N-0000074)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1885)
    (at 99 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 34 N-0000081)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1874)
    (at 109 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 35 N-0000082)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1863)
    (at 119 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 36 N-0000083)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1852)
    (at 129 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 69 row1)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 37 N-0000084)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module SW_KND2_PDP2 (layer F.Cu) (tedit 554E2AD7) (tstamp 548F1841)
    (at 229 159.5)
    (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.05 -20.3) (layer F.SilkS)
      (effects (font (size 1.2 1.2) (thickness 0.2032)))
    )
    (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))
    (fp_line (start -4.75 1.958) (end 4.75 1.958) (layer F.SilkS) (width 0.15))
    (fp_line (start -4.75 -10.3) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end 4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -18.9) (end -4.75 -18.9) (layer F.SilkS) (width 0.15))
    (fp_line (start 4.75 -10.3) (end -4.75 -10.3) (layer F.SilkS) (width 0.15))
    (pad 1 thru_hole oval (at 0 0) (size 5.08 2.54) (drill oval 3.45 1.18)
      (layers *.Cu *.Mask F.SilkS)
      (net 71 row3)
    )
    (pad 2 thru_hole oval (at 0 -5.58) (size 5.08 2.54) (drill oval 3.45 1.15)
      (layers *.Cu *.Mask F.SilkS)
      (net 27 N-0000064)
    )
    (pad 3 thru_hole circle (at 0 -15) (size 4 4) (drill 3)
      (layers *.Cu *.Mask F.SilkS)
    )
  )

  (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 554E2BA1)
    (at 18.75 133)
    (descr "Resitance 3 pas")
    (tags R)
    (path /554E5219)
    (autoplace_cost180 10)
    (fp_text reference R_S1 (at 0 0.127) (layer F.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)))
    )
    (fp_text value 300 (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 4 N-0000029)
    )
    (pad 2 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 44 RX)
    )
    (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 554E2BAF)
    (at 18.75 136.5)
    (descr "Resitance 3 pas")
    (tags R)
    (path /554E5233)
    (autoplace_cost180 10)
    (fp_text reference R_S2 (at 0 0.127) (layer F.SilkS) hide
      (effects (font (size 1.397 1.27) (thickness 0.2032)))
    )
    (fp_text value 620 (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 3 GND)
    )
    (pad 2 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128)
      (layers *.Cu *.Mask F.SilkS)
      (net 4 N-0000029)
    )
    (model discret/resistor.wrl
      (at (xyz 0 0 0))
      (scale (xyz 0.3 0.3 0.3))
      (rotate (xyz 0 0 0))
    )
  )

  (module PIN_ARRAY_4x1 (layer F.Cu) (tedit 4C10F42E) (tstamp 554E2BBB)
    (at 11.5 136 270)
    (descr "Double rangee de contacts 2 x 5 pins")
    (tags CONN)
    (path /554E5206)
    (fp_text reference P5 (at 0 -2.54 270) (layer F.SilkS)
      (effects (font (size 1.016 1.016) (thickness 0.2032)))
    )
    (fp_text value "SERIAL 5V TTL" (at 0 2.54 270) (layer F.SilkS) hide
      (effects (font (size 1.016 1.016) (thickness 0.2032)))
    )
    (fp_line (start 5.08 1.27) (end -5.08 1.27) (layer F.SilkS) (width 0.254))
    (fp_line (start 5.08 -1.27) (end -5.08 -1.27) (layer F.SilkS) (width 0.254))
    (fp_line (start -5.08 -1.27) (end -5.08 1.27) (layer F.SilkS) (width 0.254))
    (fp_line (start 5.08 1.27) (end 5.08 -1.27) (layer F.SilkS) (width 0.254))
    (pad 1 thru_hole rect (at -3.81 0 270) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask F.SilkS)
      (net 3 GND)
    )
    (pad 2 thru_hole circle (at -1.27 0 270) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask F.SilkS)
      (net 2 +5V)
    )
    (pad 3 thru_hole circle (at 1.27 0 270) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask F.SilkS)
      (net 4 N-0000029)
    )
    (pad 4 thru_hole circle (at 3.81 0 270) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask F.SilkS)
      (net 46 TX)
    )
    (model pin_array\pins_array_4x1.wrl
      (at (xyz 0 0 0))
      (scale (xyz 1 1 1))
      (rotate (xyz 0 0 0))
    )
  )

  (module PIN_ARRAY_20X2 (layer B.Cu) (tedit 5031D84E) (tstamp 54BD2EE9)
    (at 253.9 130.05)
    (descr "Double rangee de contacts 2 x 12 pins")
    (tags CONN)
    (path /554E0D39)
    (fp_text reference P3 (at 0 3.81) (layer B.SilkS)
      (effects (font (size 1.016 1.016) (thickness 0.27432)) (justify mirror))
    )
    (fp_text value EXPANSION_20X2 (at 0 -3.81) (layer B.SilkS)
      (effects (font (size 1.016 1.016) (thickness 0.2032)) (justify mirror))
    )
    (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) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 2 +5V)
    )
    (pad 2 thru_hole circle (at -24.13 1.27) (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) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 68 led8)
    )
    (pad 4 thru_hole circle (at -21.59 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
    )
    (pad 13 thru_hole circle (at -8.89 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 70 row2)
    )
    (pad 6 thru_hole circle (at -19.05 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 1 +3.3V)
    )
    (pad 15 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 45 SPARE_IO)
    )
    (pad 8 thru_hole circle (at -16.51 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 3 GND)
    )
    (pad 17 thru_hole circle (at -3.81 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 47 col1)
    )
    (pad 10 thru_hole circle (at -13.97 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 67 led7)
    )
    (pad 19 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 52 col2)
    )
    (pad 12 thru_hole circle (at -11.43 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 68 led8)
    )
    (pad 21 thru_hole circle (at 1.27 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 54 col3)
    )
    (pad 14 thru_hole circle (at -8.89 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 70 row2)
    )
    (pad 23 thru_hole circle (at 3.81 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 55 col4)
    )
    (pad 16 thru_hole circle (at -6.35 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 45 SPARE_IO)
    )
    (pad 25 thru_hole circle (at 6.35 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 56 col5)
    )
    (pad 18 thru_hole circle (at -3.81 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 47 col1)
    )
    (pad 27 thru_hole circle (at 8.89 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 57 col6)
    )
    (pad 20 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 52 col2)
    )
    (pad 29 thru_hole circle (at 11.43 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 58 col7)
    )
    (pad 22 thru_hole circle (at 1.27 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 54 col3)
    )
    (pad 31 thru_hole circle (at 13.97 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 59 col8)
    )
    (pad 24 thru_hole circle (at 3.81 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 55 col4)
    )
    (pad 26 thru_hole circle (at 6.35 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 56 col5)
    )
    (pad 33 thru_hole circle (at 16.51 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 60 col9)
    )
    (pad 28 thru_hole circle (at 8.89 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 57 col6)
    )
    (pad 32 thru_hole circle (at 13.97 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 59 col8)
    )
    (pad 34 thru_hole circle (at 16.51 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 60 col9)
    )
    (pad 36 thru_hole circle (at 19.05 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 48 col10)
    )
    (pad 38 thru_hole circle (at 21.59 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 49 col11)
    )
    (pad 35 thru_hole circle (at 19.05 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 48 col10)
    )
    (pad 37 thru_hole circle (at 21.59 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 49 col11)
    )
    (pad 3 thru_hole circle (at -21.59 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
    )
    (pad 5 thru_hole circle (at -19.05 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 1 +3.3V)
    )
    (pad 7 thru_hole circle (at -16.51 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 3 GND)
    )
    (pad 9 thru_hole circle (at -13.97 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 67 led7)
    )
    (pad 39 thru_hole circle (at 24.13 -1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 50 col12)
    )
    (pad 40 thru_hole circle (at 24.13 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 50 col12)
    )
    (pad 30 thru_hole circle (at 11.43 1.27) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 58 col7)
    )
    (model pin_array/pins_array_20x2.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 67 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 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 67 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 col5)
    )
    (model discret/leds/led3_vertical_verde.wrl
      (at (xyz 0 0 0))
      (scale (xyz 1 1 1))
      (rotate (xyz 0 0 0))
    )
  )

  (module PIN_ARRAY_3X1 (layer B.Cu) (tedit 554F4504) (tstamp 554F4492)
    (at 64.3 111.8)
    (descr "Connecteur 3 pins")
    (tags "CONN DEV")
    (path /554F46DF)
    (fp_text reference J_COL1 (at -6.7 0) (layer B.SilkS)
      (effects (font (size 1.016 1.016) (thickness 0.1524)) (justify mirror))
    )
    (fp_text value CONN_3 (at 0 2.159) (layer B.SilkS) hide
      (effects (font (size 1.016 1.016) (thickness 0.1524)) (justify mirror))
    )
    (fp_line (start -3.81 -1.27) (end -3.81 1.27) (layer B.SilkS) (width 0.1524))
    (fp_line (start -3.81 1.27) (end 3.81 1.27) (layer B.SilkS) (width 0.1524))
    (fp_line (start 3.81 1.27) (end 3.81 -1.27) (layer B.SilkS) (width 0.1524))
    (fp_line (start 3.81 -1.27) (end -3.81 -1.27) (layer B.SilkS) (width 0.1524))
    (fp_line (start -1.27 1.27) (end -1.27 -1.27) (layer B.SilkS) (width 0.1524))
    (pad 1 thru_hole rect (at -2.54 0) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 51 col1a)
    )
    (pad 2 thru_hole circle (at 0 0) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 46 TX)
    )
    (pad 3 thru_hole circle (at 2.54 0) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 46 TX)
    )
    (model pin_array/pins_array_3x1.wrl
      (at (xyz 0 0 0))
      (scale (xyz 1 1 1))
      (rotate (xyz 0 0 0))
    )
  )

  (module PIN_ARRAY_3X1 (layer B.Cu) (tedit 554F4512) (tstamp 554F449E)
    (at 64.3 115.2)
    (descr "Connecteur 3 pins")
    (tags "CONN DEV")
    (path /554F46EE)
    (fp_text reference J_COL2 (at -6.7 0) (layer B.SilkS)
      (effects (font (size 1.016 1.016) (thickness 0.1524)) (justify mirror))
    )
    (fp_text value CONN_3 (at 0 2.159) (layer B.SilkS) hide
      (effects (font (size 1.016 1.016) (thickness 0.1524)) (justify mirror))
    )
    (fp_line (start -3.81 -1.27) (end -3.81 1.27) (layer B.SilkS) (width 0.1524))
    (fp_line (start -3.81 1.27) (end 3.81 1.27) (layer B.SilkS) (width 0.1524))
    (fp_line (start 3.81 1.27) (end 3.81 -1.27) (layer B.SilkS) (width 0.1524))
    (fp_line (start 3.81 -1.27) (end -3.81 -1.27) (layer B.SilkS) (width 0.1524))
    (fp_line (start -1.27 1.27) (end -1.27 -1.27) (layer B.SilkS) (width 0.1524))
    (pad 1 thru_hole rect (at -2.54 0) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 53 col2a)
    )
    (pad 2 thru_hole circle (at 0 0) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 44 RX)
    )
    (pad 3 thru_hole circle (at 2.54 0) (size 1.524 1.524) (drill 1.016)
      (layers *.Cu *.Mask B.SilkS)
      (net 44 RX)
    )
    (model pin_array/pins_array_3x1.wrl
      (at (xyz 0 0 0))
      (scale (xyz 1 1 1))
      (rotate (xyz 0 0 0))
    )
  )

  (gr_line (start 288.5 64) (end 9.5 64) (angle 90) (layer Edge.Cuts) (width 0.1))
  (gr_line (start 9.5 163) (end 288.5 163) (angle 90) (layer Edge.Cuts) (width 0.1))
  (gr_line (start 9.5 64) (end 9.5 163) (angle 90) (layer Edge.Cuts) (width 0.1))
  (gr_line (start 65.1002 115.2144) (end 65.9892 115.2144) (angle 90) (layer B.SilkS) (width 0.2))
  (gr_line (start 65.1002 111.8108) (end 65.9892 111.8108) (angle 90) (layer B.SilkS) (width 0.2))
  (gr_text "2 optional LEDs for \nStraight Eight only" (at 262.5598 118.4148 90) (layer B.SilkS)
    (effects (font (size 0.6 0.6) (thickness 0.1)) (justify mirror))
  )
  (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 B.SilkS) (width 0.2))
  (gr_text "To enable serial port: mod RPi,\ncut traces 1-2 & jumper 2-3" (at 52.7304 112.9792) (layer B.SilkS)
    (effects (font (size 0.6 0.6) (thickness 0.1)) (justify mirror))
  )
  (gr_line (start 288.5 163) (end 288.5 64) (angle 90) (layer Edge.Cuts) (width 0.1))
  (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 234.85 128.78) (end 234.85 131.32) (width 0.381) (layer B.Cu) (net 1))
  (segment (start 88.13 122.73) (end 89.3368 122.73) (width 0.381) (layer F.Cu) (net 1))
  (segment (start 233.6431 127.5731) (end 234.85 128.78) (width 0.381) (layer F.Cu) (net 1))
  (segment (start 204.418 127.5731) (end 233.6431 127.5731) (width 0.381) (layer F.Cu) (net 1))
  (segment (start 201.1889 130.8022) (end 204.418 127.5731) (width 0.381) (layer F.Cu) (net 1))
  (segment (start 137.7069 130.8022) (end 201.1889 130.8022) (width 0.381) (layer F.Cu) (net 1))
  (segment (start 130.8107 123.906) (end 137.7069 130.8022) (width 0.381) (layer F.Cu) (net 1))
  (segment (start 130.8107 122.4756) (end 130.8107 123.906) (width 0.381) (layer F.Cu) (net 1))
  (segment (start 129.0368 120.7017) (end 130.8107 122.4756) (width 0.381) (layer F.Cu) (net 1))
  (segment (start 91.3651 120.7017) (end 129.0368 120.7017) (width 0.381) (layer F.Cu) (net 1))
  (segment (start 89.3368 122.73) (end 91.3651 120.7017) (width 0.381) (layer F.Cu) (net 1))
  (segment (start 215.19 117) (end 222.81 117) (width 0.254) (layer F.Cu) (net 2))
  (segment (start 216.7832 117) (end 215.19 117) (width 0.381) (layer B.Cu) (net 2))
  (segment (start 228.5632 128.78) (end 216.7832 117) (width 0.381) (layer B.Cu) (net 2))
  (segment (start 229.77 128.78) (end 228.5632 128.78) (width 0.381) (layer B.Cu) (net 2))
  (segment (start 229.77 131.32) (end 229.77 129.9868) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 229.77 128.78) (end 229.77 129.9868) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 88.13 125.27) (end 85.59 125.27) (width 0.381) (layer B.Cu) (net 2))
  (segment (start 76.13 134.73) (end 11.5 134.73) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 85.59 125.27) (end 76.13 134.73) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 86.9231 124.0631) (end 88.13 125.27) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 86.9231 121.744) (end 86.9231 124.0631) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 88.641 120.0261) (end 86.9231 121.744) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 137.9892 120.0261) (end 88.641 120.0261) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 138.4946 120.5315) (end 137.9892 120.0261) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 211.6585 120.5315) (end 138.4946 120.5315) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 215.19 117) (end 211.6585 120.5315) (width 0.381) (layer F.Cu) (net 2))
  (segment (start 216.7001 92.2701) (end 215.24 90.81) (width 0.254) (layer B.Cu) (net 2))
  (segment (start 222.81 117) (end 222.81 115.9202) (width 0.254) (layer B.Cu) (net 2))
  (segment (start 222.81 115.9202) (end 216.7001 109.8103) (width 0.254) (layer B.Cu) (net 2))
  (segment (start 216.7001 109.8103) (end 216.7001 92.2701) (width 0.254) (layer B.Cu) (net 2))
  (segment (start 11.5 132.19) (end 12.7068 132.19) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 36.4101 98.6598) (end 36.4101 120.6624) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 51.1529 83.917) (end 36.4101 98.6598) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 101.9637 83.917) (end 51.1529 83.917) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 110.0418 91.9951) (end 101.9637 83.917) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 221.6749 91.9951) (end 110.0418 91.9951) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 222.86 90.81) (end 221.6749 91.9951) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 25.466 120.6624) (end 36.4101 120.6624) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 13.9384 132.19) (end 25.466 120.6624) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 12.7068 132.19) (end 13.9384 132.19) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 53.7769 126.4769) (end 52.57 125.27) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 64.0631 126.4769) (end 53.7769 126.4769) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 65.27 125.27) (end 64.0631 126.4769) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 37.8024 120.6624) (end 39.87 122.73) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 36.4101 120.6624) (end 37.8024 120.6624) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 51.3 124) (end 52.57 125.27) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 41.14 124) (end 51.3 124) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 39.87 122.73) (end 41.14 124) (width 0.381) (layer F.Cu) (net 3))
  (segment (start 16.0929 135.3471) (end 14.94 136.5) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 16.0929 132.5232) (end 16.0929 135.3471) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 15.4053 131.8356) (end 16.0929 132.5232) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 13.0612 131.8356) (end 15.4053 131.8356) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 12.7068 132.19) (end 13.0612 131.8356) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 11.5 132.19) (end 12.7068 132.19) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 81.8243 126.4957) (end 83.05 125.27) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 80.0256 126.4957) (end 81.8243 126.4957) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 79.24 125.7101) (end 80.0256 126.4957) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 79.24 124) (end 77.97 122.73) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 79.24 125.7101) (end 79.24 124) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 66.4863 126.4863) (end 65.27 125.27) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 78.4638 126.4863) (end 66.4863 126.4863) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 79.24 125.7101) (end 78.4638 126.4863) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 237.39 131.32) (end 237.39 128.78) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 229.8356 97.7856) (end 222.86 90.81) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 229.8356 121.2256) (end 229.8356 97.7856) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 237.39 128.78) (end 229.8356 121.2256) (width 0.381) (layer B.Cu) (net 3))
  (segment (start 14.94 133.83) (end 14.94 133) (width 0.254) (layer B.Cu) (net 4))
  (segment (start 11.5 137.27) (end 14.94 133.83) (width 0.254) (layer B.Cu) (net 4))
  (segment (start 21.4481 137.6119) (end 22.56 136.5) (width 0.254) (layer F.Cu) (net 4))
  (segment (start 11.8419 137.6119) (end 21.4481 137.6119) (width 0.254) (layer F.Cu) (net 4))
  (segment (start 11.5 137.27) (end 11.8419 137.6119) (width 0.254) (layer F.Cu) (net 4))
  (segment (start 50.3 116.2723) (end 50.3 106.75) (width 0.254) (layer B.Cu) (net 5))
  (segment (start 56.38 122.3523) (end 50.3 116.2723) (width 0.254) (layer B.Cu) (net 5))
  (segment (start 56.38 124) (end 56.38 122.3523) (width 0.254) (layer B.Cu) (net 5))
  (segment (start 57.65 125.27) (end 56.38 124) (width 0.254) (layer B.Cu) (net 5))
  (segment (start 59.3736 105.6636) (end 60.46 106.75) (width 0.254) (layer B.Cu) (net 6))
  (segment (start 54.9319 105.6636) (end 59.3736 105.6636) (width 0.254) (layer B.Cu) (net 6))
  (segment (start 54.2629 106.3326) (end 54.9319 105.6636) (width 0.254) (layer B.Cu) (net 6))
  (segment (start 54.2629 116.8029) (end 54.2629 106.3326) (width 0.254) (layer B.Cu) (net 6))
  (segment (start 60.19 122.73) (end 54.2629 116.8029) (width 0.254) (layer B.Cu) (net 6))
  (segment (start 52.618 133.08) (end 75.09 133.08) (width 0.254) (layer B.Cu) (net 7))
  (segment (start 49 129.462) (end 52.618 133.08) (width 0.254) (layer B.Cu) (net 7))
  (segment (start 49 128.4389) (end 49 129.462) (width 0.254) (layer B.Cu) (net 7))
  (segment (start 45.8311 125.27) (end 49 128.4389) (width 0.254) (layer B.Cu) (net 7))
  (segment (start 44.95 125.27) (end 45.8311 125.27) (width 0.254) (layer B.Cu) (net 7))
  (segment (start 61.4039 105.1539) (end 63 106.75) (width 0.254) (layer B.Cu) (net 8))
  (segment (start 50.3589 105.1539) (end 61.4039 105.1539) (width 0.254) (layer B.Cu) (net 8))
  (segment (start 49.2201 106.2927) (end 50.3589 105.1539) (width 0.254) (layer B.Cu) (net 8))
  (segment (start 49.2201 117.556) (end 49.2201 106.2927) (width 0.254) (layer B.Cu) (net 8))
  (segment (start 53.7535 122.0894) (end 49.2201 117.556) (width 0.254) (layer B.Cu) (net 8))
  (segment (start 53.7535 123.1633) (end 53.7535 122.0894) (width 0.254) (layer B.Cu) (net 8))
  (segment (start 53.0434 123.8734) (end 53.7535 123.1633) (width 0.254) (layer B.Cu) (net 8))
  (segment (start 51.4266 123.8734) (end 53.0434 123.8734) (width 0.254) (layer B.Cu) (net 8))
  (segment (start 50.03 125.27) (end 51.4266 123.8734) (width 0.254) (layer B.Cu) (net 8))
  (segment (start 52.84 116.099) (end 52.84 106.75) (width 0.254) (layer B.Cu) (net 9))
  (segment (start 58.92 122.179) (end 52.84 116.099) (width 0.254) (layer B.Cu) (net 9))
  (segment (start 58.92 124) (end 58.92 122.179) (width 0.254) (layer B.Cu) (net 9))
  (segment (start 60.19 125.27) (end 58.92 124) (width 0.254) (layer B.Cu) (net 9))
  (segment (start 211.8529 133.08) (end 214.79 133.08) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 210.5187 134.4142) (end 211.8529 133.08) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 206.2707 134.4142) (end 210.5187 134.4142) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 203.2306 131.3741) (end 206.2707 134.4142) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 100.8747 131.3741) (end 203.2306 131.3741) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 99 129.4994) (end 100.8747 131.3741) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 99 128.4743) (end 99 129.4994) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 97.757 127.2313) (end 99 128.4743) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 88.4342 127.2313) (end 97.757 127.2313) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 86.86 125.6571) (end 88.4342 127.2313) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 86.86 124.9006) (end 86.86 125.6571) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 86.0806 124.1212) (end 86.86 124.9006) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 76.5788 124.1212) (end 86.0806 124.1212) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 75.43 125.27) (end 76.5788 124.1212) (width 0.254) (layer F.Cu) (net 10))
  (segment (start 42.556 148.7127) (end 42.556 136.5) (width 0.254) (layer F.Cu) (net 11))
  (segment (start 39 152.2687) (end 42.556 148.7127) (width 0.254) (layer F.Cu) (net 11))
  (segment (start 39 153.92) (end 39 152.2687) (width 0.254) (layer F.Cu) (net 11))
  (segment (start 32.556 148.7127) (end 32.556 136.5) (width 0.254) (layer B.Cu) (net 12))
  (segment (start 29 152.2687) (end 32.556 148.7127) (width 0.254) (layer B.Cu) (net 12))
  (segment (start 29 153.92) (end 29 152.2687) (width 0.254) (layer B.Cu) (net 12))
  (segment (start 52.556 148.7127) (end 52.556 136.5) (width 0.254) (layer B.Cu) (net 13))
  (segment (start 49 152.2687) (end 52.556 148.7127) (width 0.254) (layer B.Cu) (net 13))
  (segment (start 49 153.92) (end 49 152.2687) (width 0.254) (layer B.Cu) (net 13))
  (segment (start 24.8265 127.2335) (end 22.56 129.5) (width 0.254) (layer F.Cu) (net 14))
  (segment (start 67.4806 127.2335) (end 24.8265 127.2335) (width 0.254) (layer F.Cu) (net 14))
  (segment (start 69.08 125.6341) (end 67.4806 127.2335) (width 0.254) (layer F.Cu) (net 14))
  (segment (start 69.08 124.9232) (end 69.08 125.6341) (width 0.254) (layer F.Cu) (net 14))
  (segment (start 69.8766 124.1266) (end 69.08 124.9232) (width 0.254) (layer F.Cu) (net 14))
  (segment (start 74.0334 124.1266) (end 69.8766 124.1266) (width 0.254) (layer F.Cu) (net 14))
  (segment (start 75.43 122.73) (end 74.0334 124.1266) (width 0.254) (layer F.Cu) (net 14))
  (segment (start 47.5614 122.6586) (end 47.49 122.73) (width 0.254) (layer B.Cu) (net 15))
  (segment (start 47.5614 113.2398) (end 47.5614 122.6586) (width 0.254) (layer B.Cu) (net 15))
  (segment (start 41.5681 107.2465) (end 47.5614 113.2398) (width 0.254) (layer B.Cu) (net 15))
  (segment (start 41.5681 106.2783) (end 41.5681 107.2465) (width 0.254) (layer B.Cu) (net 15))
  (segment (start 43.2397 104.6067) (end 41.5681 106.2783) (width 0.254) (layer B.Cu) (net 15))
  (segment (start 63.3967 104.6067) (end 43.2397 104.6067) (width 0.254) (layer B.Cu) (net 15))
  (segment (start 65.54 106.75) (end 63.3967 104.6067) (width 0.254) (layer B.Cu) (net 15))
  (segment (start 46.6389 105.6289) (end 47.76 106.75) (width 0.254) (layer B.Cu) (net 16))
  (segment (start 44.7939 105.6289) (end 46.6389 105.6289) (width 0.254) (layer B.Cu) (net 16))
  (segment (start 44.1005 106.3223) (end 44.7939 105.6289) (width 0.254) (layer B.Cu) (net 16))
  (segment (start 44.1005 107.2817) (end 44.1005 106.3223) (width 0.254) (layer B.Cu) (net 16))
  (segment (start 48.0697 111.2509) (end 44.1005 107.2817) (width 0.254) (layer B.Cu) (net 16))
  (segment (start 48.0697 120.7697) (end 48.0697 111.2509) (width 0.254) (layer B.Cu) (net 16))
  (segment (start 50.03 122.73) (end 48.0697 120.7697) (width 0.254) (layer B.Cu) (net 16))
  (segment (start 48.5781 110.1081) (end 45.22 106.75) (width 0.254) (layer B.Cu) (net 17))
  (segment (start 48.5781 118.7381) (end 48.5781 110.1081) (width 0.254) (layer B.Cu) (net 17))
  (segment (start 52.57 122.73) (end 48.5781 118.7381) (width 0.254) (layer B.Cu) (net 17))
  (segment (start 58.7011 110.0711) (end 55.38 106.75) (width 0.254) (layer B.Cu) (net 18))
  (segment (start 58.7011 118.7011) (end 58.7011 110.0711) (width 0.254) (layer B.Cu) (net 18))
  (segment (start 62.73 122.73) (end 58.7011 118.7011) (width 0.254) (layer B.Cu) (net 18))
  (segment (start 59.4636 108.2936) (end 57.92 106.75) (width 0.254) (layer B.Cu) (net 19))
  (segment (start 59.4636 116.9236) (end 59.4636 108.2936) (width 0.254) (layer B.Cu) (net 19))
  (segment (start 65.27 122.73) (end 59.4636 116.9236) (width 0.254) (layer B.Cu) (net 19))
  (segment (start 79.0762 121.2962) (end 80.51 122.73) (width 0.254) (layer F.Cu) (net 20))
  (segment (start 49.6975 121.2962) (end 79.0762 121.2962) (width 0.254) (layer F.Cu) (net 20))
  (segment (start 42.68 114.2787) (end 49.6975 121.2962) (width 0.254) (layer F.Cu) (net 20))
  (segment (start 42.68 106.75) (end 42.68 114.2787) (width 0.254) (layer F.Cu) (net 20))
  (segment (start 82.556 148.7127) (end 82.556 136.5) (width 0.254) (layer B.Cu) (net 21))
  (segment (start 79 152.2687) (end 82.556 148.7127) (width 0.254) (layer B.Cu) (net 21))
  (segment (start 79 153.92) (end 79 152.2687) (width 0.254) (layer B.Cu) (net 21))
  (segment (start 72.556 148.7127) (end 72.556 136.5) (width 0.254) (layer B.Cu) (net 22))
  (segment (start 69 152.2687) (end 72.556 148.7127) (width 0.254) (layer B.Cu) (net 22))
  (segment (start 69 153.92) (end 69 152.2687) (width 0.254) (layer B.Cu) (net 22))
  (segment (start 62.556 148.7127) (end 62.556 136.5) (width 0.254) (layer B.Cu) (net 23))
  (segment (start 59 152.2687) (end 62.556 148.7127) (width 0.254) (layer B.Cu) (net 23))
  (segment (start 59 153.92) (end 59 152.2687) (width 0.254) (layer B.Cu) (net 23))
  (segment (start 282.556 148.7127) (end 282.556 136.5) (width 0.254) (layer F.Cu) (net 24))
  (segment (start 279 152.2687) (end 282.556 148.7127) (width 0.254) (layer F.Cu) (net 24))
  (segment (start 279 153.92) (end 279 152.2687) (width 0.254) (layer F.Cu) (net 24))
  (segment (start 212.556 148.7127) (end 212.556 136.5) (width 0.254) (layer B.Cu) (net 25))
  (segment (start 209 152.2687) (end 212.556 148.7127) (width 0.254) (layer B.Cu) (net 25))
  (segment (start 209 153.92) (end 209 152.2687) (width 0.254) (layer B.Cu) (net 25))
  (segment (start 222.556 148.7127) (end 222.556 136.5) (width 0.254) (layer B.Cu) (net 26))
  (segment (start 219 152.2687) (end 222.556 148.7127) (width 0.254) (layer B.Cu) (net 26))
  (segment (start 219 153.92) (end 219 152.2687) (width 0.254) (layer B.Cu) (net 26))
  (segment (start 232.556 148.7127) (end 232.556 136.5) (width 0.254) (layer F.Cu) (net 27))
  (segment (start 229 152.2687) (end 232.556 148.7127) (width 0.254) (layer F.Cu) (net 27))
  (segment (start 229 153.92) (end 229 152.2687) (width 0.254) (layer F.Cu) (net 27))
  (segment (start 242.556 148.7127) (end 242.556 136.5) (width 0.254) (layer B.Cu) (net 28))
  (segment (start 239 152.2687) (end 242.556 148.7127) (width 0.254) (layer B.Cu) (net 28))
  (segment (start 239 153.92) (end 239 152.2687) (width 0.254) (layer B.Cu) (net 28))
  (segment (start 252.556 148.7127) (end 252.556 136.5) (width 0.254) (layer B.Cu) (net 29))
  (segment (start 249 152.2687) (end 252.556 148.7127) (width 0.254) (layer B.Cu) (net 29))
  (segment (start 249 153.92) (end 249 152.2687) (width 0.254) (layer B.Cu) (net 29))
  (segment (start 262.556 148.7127) (end 262.556 136.5) (width 0.254) (layer B.Cu) (net 30))
  (segment (start 259 152.2687) (end 262.556 148.7127) (width 0.254) (layer B.Cu) (net 30))
  (segment (start 259 153.92) (end 259 152.2687) (width 0.254) (layer B.Cu) (net 30))
  (segment (start 272.556 148.7127) (end 272.556 136.5) (width 0.254) (layer B.Cu) (net 31))
  (segment (start 269 152.2687) (end 272.556 148.7127) (width 0.254) (layer B.Cu) (net 31))
  (segment (start 269 153.92) (end 269 152.2687) (width 0.254) (layer B.Cu) (net 31))
  (segment (start 92.556 148.7127) (end 92.556 136.5) (width 0.254) (layer B.Cu) (net 32))
  (segment (start 89 152.2687) (end 92.556 148.7127) (width 0.254) (layer B.Cu) (net 32))
  (segment (start 89 153.92) (end 89 152.2687) (width 0.254) (layer B.Cu) (net 32))
  (segment (start 182.556 148.7127) (end 182.556 136.5) (width 0.254) (layer B.Cu) (net 33))
  (segment (start 179 152.2687) (end 182.556 148.7127) (width 0.254) (layer B.Cu) (net 33))
  (segment (start 179 153.92) (end 179 152.2687) (width 0.254) (layer B.Cu) (net 33))
  (segment (start 102.556 148.7127) (end 102.556 136.5) (width 0.254) (layer B.Cu) (net 34))
  (segment (start 99 152.2687) (end 102.556 148.7127) (width 0.254) (layer B.Cu) (net 34))
  (segment (start 99 153.92) (end 99 152.2687) (width 0.254) (layer B.Cu) (net 34))
  (segment (start 112.556 148.7127) (end 112.556 136.5) (width 0.254) (layer B.Cu) (net 35))
  (segment (start 109 152.2687) (end 112.556 148.7127) (width 0.254) (layer B.Cu) (net 35))
  (segment (start 109 153.92) (end 109 152.2687) (width 0.254) (layer B.Cu) (net 35))
  (segment (start 122.556 148.7127) (end 122.556 136.5) (width 0.254) (layer B.Cu) (net 36))
  (segment (start 119 152.2687) (end 122.556 148.7127) (width 0.254) (layer B.Cu) (net 36))
  (segment (start 119 153.92) (end 119 152.2687) (width 0.254) (layer B.Cu) (net 36))
  (segment (start 129 153.92) (end 129 152.2687) (width 0.254) (layer B.Cu) (net 37))
  (segment (start 132.556 136.5) (end 132.556 137.5798) (width 0.254) (layer B.Cu) (net 37))
  (segment (start 132.556 148.7127) (end 132.556 137.5798) (width 0.254) (layer B.Cu) (net 37))
  (segment (start 129 152.2687) (end 132.556 148.7127) (width 0.254) (layer B.Cu) (net 37))
  (segment (start 142.556 148.7127) (end 142.556 136.5) (width 0.254) (layer F.Cu) (net 38))
  (segment (start 139 152.2687) (end 142.556 148.7127) (width 0.254) (layer F.Cu) (net 38))
  (segment (start 139 153.92) (end 139 152.2687) (width 0.254) (layer F.Cu) (net 38))
  (segment (start 152.556 148.7127) (end 152.556 136.5) (width 0.254) (layer B.Cu) (net 39))
  (segment (start 149 152.2687) (end 152.556 148.7127) (width 0.254) (layer B.Cu) (net 39))
  (segment (start 149 153.92) (end 149 152.2687) (width 0.254) (layer B.Cu) (net 39))
  (segment (start 162.556 148.7127) (end 162.556 136.5) (width 0.254) (layer F.Cu) (net 40))
  (segment (start 159 152.2687) (end 162.556 148.7127) (width 0.254) (layer F.Cu) (net 40))
  (segment (start 159 153.92) (end 159 152.2687) (width 0.254) (layer F.Cu) (net 40))
  (segment (start 172.556 148.7127) (end 172.556 136.5) (width 0.254) (layer F.Cu) (net 41))
  (segment (start 169 152.2687) (end 172.556 148.7127) (width 0.254) (layer F.Cu) (net 41))
  (segment (start 169 153.92) (end 169 152.2687) (width 0.254) (layer F.Cu) (net 41))
  (segment (start 192.556 148.7127) (end 192.556 136.5) (width 0.254) (layer B.Cu) (net 42))
  (segment (start 189 152.2687) (end 192.556 148.7127) (width 0.254) (layer B.Cu) (net 42))
  (segment (start 189 153.92) (end 189 152.2687) (width 0.254) (layer B.Cu) (net 42))
  (segment (start 202.556 148.7127) (end 202.556 136.5) (width 0.254) (layer B.Cu) (net 43))
  (segment (start 199 152.2687) (end 202.556 148.7127) (width 0.254) (layer B.Cu) (net 43))
  (segment (start 199 153.92) (end 199 152.2687) (width 0.254) (layer B.Cu) (net 43))
  (segment (start 64.3 115.2) (end 66.84 115.2) (width 0.254) (layer F.Cu) (net 44))
  (segment (start 42.7916 104.0984) (end 40.14 106.75) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 64.4354 104.0984) (end 42.7916 104.0984) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 66.62 106.283) (end 64.4354 104.0984) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 66.62 107.2192) (end 66.62 106.283) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 65.0924 108.7468) (end 66.62 107.2192) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 62.6625 108.7468) (end 65.0924 108.7468) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 60.6166 110.7927) (end 62.6625 108.7468) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 60.6166 112.7519) (end 60.6166 110.7927) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 61.9213 114.0566) (end 60.6166 112.7519) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 63.1566 114.0566) (end 61.9213 114.0566) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 64.3 115.2) (end 63.1566 114.0566) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 70.24 133) (end 22.56 133) (width 0.254) (layer F.Cu) (net 44))
  (segment (start 77.97 125.27) (end 70.24 133) (width 0.254) (layer F.Cu) (net 44))
  (segment (start 76.7 124) (end 77.97 125.27) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 66.84 115.2) (end 67.1787 114.8613) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 67.1787 114.8613) (end 73.2959 114.8613) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 73.2959 114.8613) (end 76.7 118.2654) (width 0.254) (layer B.Cu) (net 44))
  (segment (start 76.7 118.2654) (end 76.7 124) (width 0.254) (layer B.Cu) (net 44))
  (via (at 162.2826 127.0012) (size 0.889) (layers F.Cu B.Cu) (net 45))
  (segment (start 247.55 128.78) (end 247.55 131.32) (width 0.254) (layer F.Cu) (net 45))
  (segment (start 245.7712 127.0012) (end 162.2826 127.0012) (width 0.254) (layer F.Cu) (net 45))
  (segment (start 247.55 128.78) (end 245.7712 127.0012) (width 0.254) (layer F.Cu) (net 45))
  (segment (start 161.9792 126.6978) (end 162.2826 127.0012) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 98.254 126.6978) (end 161.9792 126.6978) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 92.6456 132.3062) (end 98.254 126.6978) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 85.7128 132.3062) (end 92.6456 132.3062) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 84.8598 131.4532) (end 85.7128 132.3062) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 72.1583 131.4532) (end 84.8598 131.4532) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 71.867 131.7445) (end 72.1583 131.4532) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 54.8876 131.7445) (end 71.867 131.7445) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 48.76 125.6169) (end 54.8876 131.7445) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 48.76 124.9205) (end 48.76 125.6169) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 47.9661 124.1266) (end 48.76 124.9205) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 46.3466 124.1266) (end 47.9661 124.1266) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 44.95 122.73) (end 46.3466 124.1266) (width 0.254) (layer B.Cu) (net 45))
  (segment (start 64.3 111.8) (end 66.84 111.8) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 39.2496 105.1004) (end 37.6 106.75) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 50.2323 105.1004) (end 39.2496 105.1004) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 51.57 106.4381) (end 50.2323 105.1004) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 51.57 107.0356) (end 51.57 106.4381) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 55.1911 110.6567) (end 51.57 107.0356) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 63.1567 110.6567) (end 55.1911 110.6567) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 64.3 111.8) (end 63.1567 110.6567) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 10.3482 138.6582) (end 11.5 139.81) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 10.3482 134.2582) (end 10.3482 138.6582) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 11.0826 133.5238) (end 10.3482 134.2582) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 12.991 133.5238) (end 11.0826 133.5238) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 13.5623 134.0951) (end 12.991 133.5238) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 71.6849 134.0951) (end 13.5623 134.0951) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 80.51 125.27) (end 71.6849 134.0951) (width 0.254) (layer F.Cu) (net 46))
  (segment (start 81.7006 124.0794) (end 80.51 125.27) (width 0.254) (layer B.Cu) (net 46))
  (segment (start 66.84 111.8) (end 71.2498 111.8) (width 0.254) (layer B.Cu) (net 46))
  (segment (start 71.2498 111.8) (end 81.7006 122.2508) (width 0.254) (layer B.Cu) (net 46))
  (segment (start 81.7006 122.2508) (end 81.7006 124.0794) (width 0.254) (layer B.Cu) (net 46))
  (segment (start 89.7475 114.9225) (end 90.27 114.4) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 89.7475 128.4775) (end 89.7475 114.9225) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 90.27 129) (end 89.7475 128.4775) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 30.27 91.8) (end 37.6 99.13) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 30.27 70.6) (end 30.27 91.8) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 25.19 111.54) (end 25.19 136.5) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 37.6 99.13) (end 25.19 111.54) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 90.27 114.4) (end 90.27 99.8) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 89.7645 71.1055) (end 90.27 70.6) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 89.7645 84.6945) (end 89.7645 71.1055) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 90.27 85.2) (end 89.7645 84.6945) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 250.09 131.32) (end 250.09 128.78) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 240.27 76.6805) (end 240.27 70.6) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 240.7751 76.6805) (end 240.27 76.6805) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 245.0476 80.953) (end 240.7751 76.6805) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 245.0476 88.8697) (end 245.0476 80.953) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 257.2282 101.0503) (end 245.0476 88.8697) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 259.0197 101.0503) (end 257.2282 101.0503) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 260.27 99.8) (end 259.0197 101.0503) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 250.09 98.6192) (end 250.09 128.78) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 242.4985 91.0277) (end 250.09 98.6192) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 242.4985 84.1909) (end 242.4985 91.0277) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 239.0505 80.7429) (end 242.4985 84.1909) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 239.0505 77.395) (end 239.0505 80.7429) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 239.765 76.6805) (end 239.0505 77.395) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 240.27 76.6805) (end 239.765 76.6805) (width 0.254) (layer B.Cu) (net 47))
  (segment (start 38.724 98.006) (end 37.6 99.13) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 90.27 98.006) (end 38.724 98.006) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 90.27 99.8) (end 90.27 98.006) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 90.27 98.006) (end 90.27 85.2) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 246.9958 134.4142) (end 250.09 131.32) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 211.5968 134.4142) (end 246.9958 134.4142) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 209.511 136.5) (end 211.5968 134.4142) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 205.19 136.5) (end 209.511 136.5) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 90.27 131.9828) (end 90.27 129) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 200.6728 131.9828) (end 90.27 131.9828) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 205.19 136.5) (end 200.6728 131.9828) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 89.7072 131.9828) (end 85.19 136.5) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 90.27 131.9828) (end 89.7072 131.9828) (width 0.254) (layer F.Cu) (net 47))
  (segment (start 180.27 70.6) (end 180.27 85.2) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 180.27 99.8) (end 180.27 114.4) (width 0.254) (layer F.Cu) (net 48))
  (segment (start 180.27 114.4) (end 180.27 129) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 180.27 131.42) (end 175.19 136.5) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 180.27 129) (end 180.27 131.42) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 272.95 131.32) (end 272.95 128.78) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 180.27 85.2) (end 180.27 99.8) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 62.0927 100.7627) (end 60.46 99.13) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 68.4168 100.7627) (end 62.0927 100.7627) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 86.7466 119.0925) (end 68.4168 100.7627) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 86.7466 123.2801) (end 86.7466 119.0925) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 86.0267 124) (end 86.7466 123.2801) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 85.2432 124) (end 86.0267 124) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 84.4466 124.7966) (end 85.2432 124) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 84.4466 129) (end 84.4466 124.7966) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 84.4466 129) (end 70.27 129) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 86.0054 129) (end 84.4466 129) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 87.2621 130.2567) (end 86.0054 129) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 91.3517 130.2567) (end 87.2621 130.2567) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 97.9385 123.6699) (end 91.3517 130.2567) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 162.1397 123.6699) (end 97.9385 123.6699) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 169.0327 116.7769) (end 162.1397 123.6699) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 169.0327 116.7521) (end 169.0327 116.7769) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 170.1121 115.6727) (end 169.0327 116.7521) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 170.77 115.6727) (end 170.1121 115.6727) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 180.27 106.1727) (end 170.77 115.6727) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 180.27 99.8) (end 180.27 106.1727) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 259 76.63) (end 260.27 77.9) (width 0.254) (layer F.Cu) (net 48))
  (segment (start 259 70.049) (end 259 76.63) (width 0.254) (layer F.Cu) (net 48))
  (segment (start 258.3066 69.3556) (end 259 70.049) (width 0.254) (layer F.Cu) (net 48))
  (segment (start 214.99 69.3556) (end 258.3066 69.3556) (width 0.254) (layer F.Cu) (net 48))
  (segment (start 211.9706 72.375) (end 214.99 69.3556) (width 0.254) (layer F.Cu) (net 48))
  (segment (start 182.045 72.375) (end 211.9706 72.375) (width 0.254) (layer F.Cu) (net 48))
  (segment (start 180.27 70.6) (end 182.045 72.375) (width 0.254) (layer F.Cu) (net 48))
  (segment (start 272.95 109.9576) (end 272.95 128.78) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 256.4706 93.4782) (end 272.95 109.9576) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 256.4706 81.6994) (end 256.4706 93.4782) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 260.27 77.9) (end 256.4706 81.6994) (width 0.254) (layer B.Cu) (net 48))
  (segment (start 190.27 114.4) (end 190.27 129) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 190.27 131.42) (end 185.19 136.5) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 190.27 129) (end 190.27 131.42) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 64.0912 100.2212) (end 63 99.13) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 65.9879 100.2212) (end 64.0912 100.2212) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 68.3427 97.8664) (end 65.9879 100.2212) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 68.3427 88.2627) (end 68.3427 97.8664) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 87.7805 68.8249) (end 68.3427 88.2627) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 188.4949 68.8249) (end 87.7805 68.8249) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 190.27 70.6) (end 188.4949 68.8249) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 190.27 99.8) (end 190.27 114.4) (width 0.254) (layer F.Cu) (net 49))
  (segment (start 190.27 70.6) (end 190.27 85.2) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 190.27 85.2) (end 190.27 99.8) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 192.5263 87.4563) (end 190.27 85.2) (width 0.254) (layer F.Cu) (net 49))
  (segment (start 244.0222 87.4563) (end 192.5263 87.4563) (width 0.254) (layer F.Cu) (net 49))
  (segment (start 250.2897 93.7238) (end 244.0222 87.4563) (width 0.254) (layer F.Cu) (net 49))
  (segment (start 260.773 93.7238) (end 250.2897 93.7238) (width 0.254) (layer F.Cu) (net 49))
  (segment (start 261.5335 92.9633) (end 260.773 93.7238) (width 0.254) (layer F.Cu) (net 49))
  (segment (start 261.5335 86.4635) (end 261.5335 92.9633) (width 0.254) (layer F.Cu) (net 49))
  (segment (start 260.27 85.2) (end 261.5335 86.4635) (width 0.254) (layer F.Cu) (net 49))
  (segment (start 275.49 131.32) (end 275.49 128.78) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 259 86.47) (end 260.27 85.2) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 259 93.1606) (end 259 86.47) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 275.49 109.6506) (end 259 93.1606) (width 0.254) (layer B.Cu) (net 49))
  (segment (start 275.49 128.78) (end 275.49 109.6506) (width 0.254) (layer B.Cu) (net 49))
  (via (at 203.034 110.2619) (size 0.889) (layers F.Cu B.Cu) (net 50))
  (segment (start 199.029 130.241) (end 200.27 129) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 197.0417 130.241) (end 199.029 130.241) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 196.5005 129.6998) (end 197.0417 130.241) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 196.5005 118.1695) (end 196.5005 129.6998) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 200.27 114.4) (end 196.5005 118.1695) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 197.0417 134.6483) (end 195.19 136.5) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 197.0417 130.241) (end 197.0417 134.6483) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 202.0039 86.9339) (end 200.27 85.2) (width 0.254) (layer F.Cu) (net 50))
  (segment (start 254.7039 86.9339) (end 202.0039 86.9339) (width 0.254) (layer F.Cu) (net 50))
  (segment (start 260.27 92.5) (end 254.7039 86.9339) (width 0.254) (layer F.Cu) (net 50))
  (segment (start 278.03 131.32) (end 278.03 128.78) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 278.03 110.26) (end 260.27 92.5) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 278.03 128.78) (end 278.03 110.26) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 193.8351 71.8196) (end 199.4465 71.8196) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 190.332 68.3165) (end 193.8351 71.8196) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 87.5205 68.3165) (end 190.332 68.3165) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 65.54 90.297) (end 87.5205 68.3165) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 65.54 99.13) (end 65.54 90.297) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 200.27 70.9961) (end 200.27 70.6) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 199.4465 71.8196) (end 200.27 70.9961) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 199.4465 71.8196) (end 199.4465 83.9286) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 199.4465 84.3765) (end 200.27 85.2) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 199.4465 83.9286) (end 199.4465 84.3765) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 196.5105 96.0405) (end 200.27 99.8) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 196.5105 84.6626) (end 196.5105 96.0405) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 197.2445 83.9286) (end 196.5105 84.6626) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 199.4465 83.9286) (end 197.2445 83.9286) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 200.27 107.4979) (end 203.034 110.2619) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 200.27 99.8) (end 200.27 107.4979) (width 0.254) (layer B.Cu) (net 50))
  (segment (start 200.27 113.0259) (end 203.034 110.2619) (width 0.254) (layer F.Cu) (net 50))
  (segment (start 200.27 114.4) (end 200.27 113.0259) (width 0.254) (layer F.Cu) (net 50))
  (segment (start 61.76 111.8) (end 62.9033 111.8) (width 0.254) (layer B.Cu) (net 51))
  (segment (start 62.9033 111.5142) (end 62.9033 111.8) (width 0.254) (layer B.Cu) (net 51))
  (segment (start 63.7609 110.6566) (end 62.9033 111.5142) (width 0.254) (layer B.Cu) (net 51))
  (segment (start 71.4668 110.6566) (end 63.7609 110.6566) (width 0.254) (layer B.Cu) (net 51))
  (segment (start 81.1814 120.3712) (end 71.4668 110.6566) (width 0.254) (layer B.Cu) (net 51))
  (segment (start 83.2312 120.3712) (end 81.1814 120.3712) (width 0.254) (layer B.Cu) (net 51))
  (segment (start 85.59 122.73) (end 83.2312 120.3712) (width 0.254) (layer B.Cu) (net 51))
  (via (at 100.27 122.844) (size 0.889) (layers F.Cu B.Cu) (net 52))
  (segment (start 100.27 85.2) (end 100.27 70.6) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 100.27 131.42) (end 95.19 136.5) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 100.27 129) (end 100.27 131.42) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 252.63 131.32) (end 252.63 128.78) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 100.27 99.8) (end 100.27 85.2) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 41.5103 71.8403) (end 40.27 70.6) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 62.954 71.8403) (end 41.5103 71.8403) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 65.4471 69.3472) (end 62.954 71.8403) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 99.0172 69.3472) (end 65.4471 69.3472) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 100.27 70.6) (end 99.0172 69.3472) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 100.27 114.4) (end 100.27 99.8) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 100.27 122.844) (end 100.27 114.4) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 100.27 129) (end 100.27 122.844) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 40.27 99) (end 40.14 99.13) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 40.27 70.6) (end 40.27 99) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 30.814 132.124) (end 35.19 136.5) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 29.1142 132.124) (end 30.814 132.124) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 26.4733 129.4831) (end 29.1142 132.124) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 26.4733 112.7967) (end 26.4733 129.4831) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 40.14 99.13) (end 26.4733 112.7967) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 244.5392 82.1692) (end 240.27 77.9) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 244.5392 89.0801) (end 244.5392 82.1692) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 257.2572 101.7981) (end 244.5392 89.0801) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 257.2572 105.8449) (end 257.2572 101.7981) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 252.63 110.4721) (end 257.2572 105.8449) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 252.63 128.78) (end 252.63 110.4721) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 259.0149 105.8449) (end 260.27 107.1) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 257.2572 105.8449) (end 259.0149 105.8449) (width 0.254) (layer B.Cu) (net 52))
  (segment (start 216.5134 135.1766) (end 215.19 136.5) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 248.7734 135.1766) (end 216.5134 135.1766) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 252.63 131.32) (end 248.7734 135.1766) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 97.3006 134.3894) (end 95.19 136.5) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 195.3253 134.3894) (end 97.3006 134.3894) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 198.5324 137.5965) (end 195.3253 134.3894) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 214.0935 137.5965) (end 198.5324 137.5965) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 215.19 136.5) (end 214.0935 137.5965) (width 0.254) (layer F.Cu) (net 52))
  (segment (start 80.9148 120.5948) (end 83.05 122.73) (width 0.254) (layer F.Cu) (net 53))
  (segment (start 68.0123 120.5948) (end 80.9148 120.5948) (width 0.254) (layer F.Cu) (net 53))
  (segment (start 62.9033 115.4858) (end 68.0123 120.5948) (width 0.254) (layer F.Cu) (net 53))
  (segment (start 62.9033 115.2) (end 62.9033 115.4858) (width 0.254) (layer F.Cu) (net 53))
  (segment (start 61.76 115.2) (end 62.9033 115.2) (width 0.254) (layer F.Cu) (net 53))
  (via (at 110.27 122.844) (size 0.889) (layers F.Cu B.Cu) (net 54))
  (segment (start 110.27 131.42) (end 105.19 136.5) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 110.27 129) (end 110.27 131.42) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 110.27 70.6) (end 110.27 85.2) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 277.9404 72.9296) (end 280.27 70.6) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 270.8089 72.9296) (end 277.9404 72.9296) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 259 84.7385) (end 270.8089 72.9296) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 259 85.6562) (end 259 84.7385) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 258.2306 86.4256) (end 259 85.6562) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 241.4956 86.4256) (end 258.2306 86.4256) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 240.27 85.2) (end 241.4956 86.4256) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 52.5394 68.3306) (end 50.27 70.6) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 108.0006 68.3306) (end 52.5394 68.3306) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 110.27 70.6) (end 108.0006 68.3306) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 110.27 85.2) (end 110.27 99.8) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 110.27 99.8) (end 110.27 114.4) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 110.27 114.4) (end 110.27 122.844) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 110.27 129) (end 110.27 122.844) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 255.17 128.78) (end 255.17 131.32) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 228.0301 133.6599) (end 225.19 136.5) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 246.8371 133.6599) (end 228.0301 133.6599) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 248.82 131.677) (end 246.8371 133.6599) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 249.6549 132.5119) (end 248.82 131.677) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 253.9781 132.5119) (end 249.6549 132.5119) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 255.17 131.32) (end 253.9781 132.5119) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 240.27 90.043) (end 240.27 85.2) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 248.82 98.593) (end 240.27 90.043) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 248.82 131.677) (end 248.82 98.593) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 106.7922 134.8978) (end 105.19 136.5) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 195.1149 134.8978) (end 106.7922 134.8978) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 198.322 138.1049) (end 195.1149 134.8978) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 223.5851 138.1049) (end 198.322 138.1049) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 225.19 136.5) (end 223.5851 138.1049) (width 0.254) (layer F.Cu) (net 54))
  (segment (start 42.68 78.19) (end 42.68 99.13) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 50.27 70.6) (end 42.68 78.19) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 43.0937 134.4037) (end 45.19 136.5) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 33.8877 134.4037) (end 43.0937 134.4037) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 29 129.516) (end 33.8877 134.4037) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 29 112.3634) (end 29 129.516) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 42.2334 99.13) (end 29 112.3634) (width 0.254) (layer B.Cu) (net 54))
  (segment (start 42.68 99.13) (end 42.2334 99.13) (width 0.254) (layer B.Cu) (net 54))
  (via (at 120.27 122.844) (size 0.889) (layers F.Cu B.Cu) (net 55))
  (segment (start 120.27 70.6) (end 120.27 85.2) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 120.27 85.2) (end 120.27 99.8) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 120.27 99.8) (end 120.27 114.4) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 254.8311 134.1989) (end 257.71 131.32) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 237.4911 134.1989) (end 254.8311 134.1989) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 235.19 136.5) (end 237.4911 134.1989) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 62.0311 68.8389) (end 60.27 70.6) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 100.907 68.8389) (end 62.0311 68.8389) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 103.8889 71.8208) (end 100.907 68.8389) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 119.0492 71.8208) (end 103.8889 71.8208) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 120.27 70.6) (end 119.0492 71.8208) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 120.27 131.42) (end 115.19 136.5) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 120.27 129) (end 120.27 131.42) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 120.27 114.4) (end 120.27 122.844) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 120.27 129) (end 120.27 122.844) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 45.22 85.65) (end 60.27 70.6) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 45.22 99.13) (end 45.22 85.65) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 237.3336 89.5636) (end 240.27 92.5) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 124.6336 89.5636) (end 237.3336 89.5636) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 120.27 85.2) (end 124.6336 89.5636) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 279 79.17) (end 280.27 77.9) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 279 90.12) (end 279 79.17) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 258.445 110.675) (end 279 90.12) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 240.27 92.5) (end 258.445 110.675) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 260.27 112.5) (end 260.27 114.4) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 258.445 110.675) (end 260.27 112.5) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 259 127.49) (end 257.71 128.78) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 259 115.67) (end 259 127.49) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 260.27 114.4) (end 259 115.67) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 257.71 128.78) (end 257.71 131.32) (width 0.254) (layer B.Cu) (net 55))
  (segment (start 56.2699 135.4201) (end 55.19 136.5) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 77.6829 135.4201) (end 56.2699 135.4201) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 79.8427 137.5799) (end 77.6829 135.4201) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 114.1101 137.5799) (end 79.8427 137.5799) (width 0.254) (layer F.Cu) (net 55))
  (segment (start 115.19 136.5) (end 114.1101 137.5799) (width 0.254) (layer F.Cu) (net 55))
  (via (at 129.9214 122.844) (size 0.889) (layers F.Cu B.Cu) (net 56))
  (segment (start 130.27 85.2) (end 130.27 99.8) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 130.27 99.8) (end 130.27 114.4) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 256.565 135.005) (end 260.25 131.32) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 246.685 135.005) (end 256.565 135.005) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 245.19 136.5) (end 246.685 135.005) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 129.9214 128.6514) (end 129.9214 122.844) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 130.27 129) (end 129.9214 128.6514) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 130.27 122.4954) (end 129.9214 122.844) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 130.27 114.4) (end 130.27 122.4954) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 130.27 131.42) (end 125.19 136.5) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 130.27 129) (end 130.27 131.42) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 67.294 138.604) (end 65.19 136.5) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 123.086 138.604) (end 67.294 138.604) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 125.19 136.5) (end 123.086 138.604) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 260.25 121.72) (end 260.25 128.78) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 260.27 121.7) (end 260.25 121.72) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 260.25 128.78) (end 260.25 131.32) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 70.27 76.62) (end 47.76 99.13) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 70.27 70.6) (end 70.27 76.62) (width 0.254) (layer B.Cu) (net 56))
  (segment (start 280.27 96.1423) (end 258.4412 117.9711) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 280.27 85.2) (end 280.27 96.1423) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 260.27 119.8) (end 258.4412 117.9711) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 260.27 121.7) (end 260.27 119.8) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 130.27 74.0582) (end 128.5409 72.3291) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 130.27 85.2) (end 130.27 74.0582) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 97.0709 72.3291) (end 128.5409 72.3291) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 96.4914 71.7496) (end 97.0709 72.3291) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 91.5172 71.7496) (end 96.4914 71.7496) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 91.441 71.8258) (end 91.5172 71.7496) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 71.4958 71.8258) (end 91.441 71.8258) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 70.27 70.6) (end 71.4958 71.8258) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 128.5409 72.3291) (end 130.27 70.6) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 258.4412 117.9711) (end 240.27 99.8) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 235.2726 94.8026) (end 240.27 99.8) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 135.2674 94.8026) (end 235.2726 94.8026) (width 0.254) (layer F.Cu) (net 56))
  (segment (start 130.27 99.8) (end 135.2674 94.8026) (width 0.254) (layer F.Cu) (net 56))
  (via (at 140.27 122.805) (size 0.889) (layers F.Cu B.Cu) (net 57))
  (segment (start 262.79 128.78) (end 262.79 131.32) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 257.61 136.5) (end 255.19 136.5) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 262.79 131.32) (end 257.61 136.5) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 140.27 70.6) (end 140.27 85.2) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 140.27 99.8) (end 140.27 85.2) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 31.1683 129) (end 30.27 129) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 76.7848 138.0948) (end 75.19 136.5) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 116.7935 138.0948) (end 76.7848 138.0948) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 119.4682 135.4201) (end 116.7935 138.0948) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 134.1101 135.4201) (end 119.4682 135.4201) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 135.19 136.5) (end 134.1101 135.4201) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 241.11 107.1) (end 240.27 107.1) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 262.79 128.78) (end 241.11 107.1) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 140.27 131.42) (end 135.19 136.5) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 140.27 129) (end 140.27 131.42) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 140.27 99.8) (end 140.27 114.4) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 36.0636 133.8953) (end 31.1683 129) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 72.5853 133.8953) (end 36.0636 133.8953) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 75.19 136.5) (end 72.5853 133.8953) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 140.27 114.4) (end 140.27 122.805) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 140.27 122.805) (end 140.27 129) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 47.3653 102.0647) (end 50.3 99.13) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 40.0177 102.0647) (end 47.3653 102.0647) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 31.1683 110.9141) (end 40.0177 102.0647) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 31.1683 129) (end 31.1683 110.9141) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 77.9693 72.9007) (end 80.27 70.6) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 76.5293 72.9007) (end 77.9693 72.9007) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 50.3 99.13) (end 76.5293 72.9007) (width 0.254) (layer B.Cu) (net 57))
  (segment (start 238.1754 105.0054) (end 240.27 107.1) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 228.7164 105.0054) (end 238.1754 105.0054) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 223.5908 99.8798) (end 228.7164 105.0054) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 214.8688 99.8798) (end 223.5908 99.8798) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 212.5019 97.5129) (end 214.8688 99.8798) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 165.3282 97.5129) (end 212.5019 97.5129) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 161.2551 101.586) (end 165.3282 97.5129) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 142.056 101.586) (end 161.2551 101.586) (width 0.254) (layer F.Cu) (net 57))
  (segment (start 140.27 99.8) (end 142.056 101.586) (width 0.254) (layer F.Cu) (net 57))
  (via (at 158.0419 121.5844) (size 0.889) (layers F.Cu B.Cu) (net 58))
  (segment (start 150.27 85.2) (end 150.27 70.6) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 265.33 136.36) (end 265.19 136.5) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 265.33 131.32) (end 265.33 136.36) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 81.4988 115.6288) (end 80.27 114.4) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 149.0412 115.6288) (end 81.4988 115.6288) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 150.27 114.4) (end 149.0412 115.6288) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 150.27 85.2) (end 150.27 99.8) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 150.27 99.8) (end 150.27 114.4) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 150.8575 114.4) (end 158.0419 121.5844) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 150.27 114.4) (end 150.8575 114.4) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 247.4947 114.4) (end 240.27 114.4) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 261.52 128.4253) (end 247.4947 114.4) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 261.52 129.1267) (end 261.52 128.4253) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 262.3462 129.9529) (end 261.52 129.1267) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 264.1571 129.9529) (end 262.3462 129.9529) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 265.33 128.78) (end 264.1571 129.9529) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 264.1571 130.1471) (end 265.33 131.32) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 264.1571 129.9529) (end 264.1571 130.1471) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 157.6856 121.5844) (end 158.0419 121.5844) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 150.27 129) (end 157.6856 121.5844) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 233.0856 121.5844) (end 240.27 114.4) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 158.0419 121.5844) (end 233.0856 121.5844) (width 0.254) (layer F.Cu) (net 58))
  (segment (start 150.27 131.42) (end 145.19 136.5) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 150.27 129) (end 150.27 131.42) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 38.7266 127.4566) (end 40.27 129) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 38.7266 106.6156) (end 38.7266 127.4566) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 41.8307 103.5115) (end 38.7266 106.6156) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 48.4585 103.5115) (end 41.8307 103.5115) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 52.84 99.13) (end 48.4585 103.5115) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 56.7912 103.0812) (end 52.84 99.13) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 64.6395 103.0812) (end 56.7912 103.0812) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 77.178 115.6197) (end 64.6395 103.0812) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 79.0503 115.6197) (end 77.178 115.6197) (width 0.254) (layer B.Cu) (net 58))
  (segment (start 80.27 114.4) (end 79.0503 115.6197) (width 0.254) (layer B.Cu) (net 58))
  (via (at 34.4426 128.0754) (size 0.889) (layers F.Cu B.Cu) (net 59))
  (via (at 162.2028 122.439) (size 0.889) (layers F.Cu B.Cu) (net 59))
  (segment (start 273.7505 135.0605) (end 275.19 136.5) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 271.6105 135.0605) (end 273.7505 135.0605) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 267.87 131.32) (end 271.6105 135.0605) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 267.87 128.78) (end 267.87 131.32) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 245.0628 126.4928) (end 240.27 121.7) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 245.0628 126.4929) (end 245.0628 126.4928) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 257.052 126.4929) (end 245.0628 126.4929) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 258.98 128.4209) (end 257.052 126.4929) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 258.98 129.1268) (end 258.98 128.4209) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 259.7766 129.9234) (end 258.98 129.1268) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 260.4702 129.9234) (end 259.7766 129.9234) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 261.3934 130.8466) (end 260.4702 129.9234) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 261.3934 131.5737) (end 261.3934 130.8466) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 262.3 132.4803) (end 261.3934 131.5737) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 266.7097 132.4803) (end 262.3 132.4803) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 267.87 131.32) (end 266.7097 132.4803) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 160.27 131.42) (end 155.19 136.5) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 160.27 129) (end 160.27 131.42) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 34.7376 127.7804) (end 34.4426 128.0754) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 42.5862 127.7804) (end 34.7376 127.7804) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 45.0282 130.2224) (end 42.5862 127.7804) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 49.0476 130.2224) (end 45.0282 130.2224) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 50.27 129) (end 49.0476 130.2224) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 158.4779 127.2079) (end 160.27 129) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 110.309 127.2079) (end 158.4779 127.2079) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 109 128.5169) (end 110.309 127.2079) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 109 129.464) (end 109 128.5169) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 107.4969 130.9671) (end 109 129.464) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 104.7575 130.9671) (end 107.4969 130.9671) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 98.0985 137.6261) (end 104.7575 130.9671) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 94.7424 137.6261) (end 98.0985 137.6261) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 93.6932 136.5769) (end 94.7424 137.6261) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 93.6932 135.6392) (end 93.6932 136.5769) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 93.072 135.018) (end 93.6932 135.6392) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 86.4229 135.018) (end 93.072 135.018) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 83.3665 131.9616) (end 86.4229 135.018) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 72.3687 131.9616) (end 83.3665 131.9616) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 72.0775 132.2528) (end 72.3687 131.9616) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 53.5228 132.2528) (end 72.0775 132.2528) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 50.27 129) (end 53.5228 132.2528) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 160.27 114.4) (end 160.27 101.0468) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 160.27 101.0468) (end 160.27 99.8) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 163.0305 123.2667) (end 162.2028 122.439) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 238.7033 123.2667) (end 163.0305 123.2667) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 240.27 121.7) (end 238.7033 123.2667) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 160.27 126.0272) (end 160.27 129) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 163.0305 123.2667) (end 160.27 126.0272) (width 0.254) (layer F.Cu) (net 59))
  (segment (start 160.27 120.5062) (end 160.27 114.4) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 162.2028 122.439) (end 160.27 120.5062) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 31.7164 125.3492) (end 34.4426 128.0754) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 31.7164 111.0923) (end 31.7164 125.3492) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 40.2357 102.573) (end 31.7164 111.0923) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 48.3842 102.573) (end 40.2357 102.573) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 51.7499 99.2073) (end 48.3842 102.573) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 51.7499 98.693) (end 51.7499 99.2073) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 52.3962 98.0467) (end 51.7499 98.693) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 54.2967 98.0467) (end 52.3962 98.0467) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 55.38 99.13) (end 54.2967 98.0467) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 156.4896 88.9804) (end 160.27 85.2) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 156.4896 100.2923) (end 156.4896 88.9804) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 157.2441 101.0468) (end 156.4896 100.2923) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 160.27 101.0468) (end 157.2441 101.0468) (width 0.254) (layer B.Cu) (net 59))
  (segment (start 160.27 85.2) (end 160.27 70.6) (width 0.254) (layer B.Cu) (net 59))
  (via (at 170.8751 117.5151) (size 0.889) (layers F.Cu B.Cu) (net 60))
  (via (at 56.7816 109.3605) (size 0.889) (layers F.Cu B.Cu) (net 60))
  (segment (start 170.27 114.4) (end 170.27 99.8) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 170.27 70.6) (end 170.27 85.2) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 170.27 85.2) (end 170.27 99.8) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 170.27 131.42) (end 165.19 136.5) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 170.27 129) (end 170.27 131.42) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 170.8751 115.0051) (end 170.8751 117.5151) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 170.27 114.4) (end 170.8751 115.0051) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 169.3295 119.0607) (end 169.3295 126.1413) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 170.8751 117.5151) (end 169.3295 119.0607) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 169.3295 128.0595) (end 169.3295 126.1413) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 170.27 129) (end 169.3295 128.0595) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 270.41 131.32) (end 270.41 128.78) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 255.9498 74.9202) (end 260.27 70.6) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 255.9498 93.6765) (end 255.9498 74.9202) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 270.41 108.1367) (end 255.9498 93.6765) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 270.41 128.78) (end 270.41 108.1367) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 63.6218 131.2362) (end 61.3856 129) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 71.6565 131.2362) (end 63.6218 131.2362) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 71.9571 130.9356) (end 71.6565 131.2362) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 85.0612 130.9356) (end 71.9571 130.9356) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 85.9234 131.7978) (end 85.0612 130.9356) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 92.0876 131.7978) (end 85.9234 131.7978) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 97.7441 126.1413) (end 92.0876 131.7978) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 169.3295 126.1413) (end 97.7441 126.1413) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 61.3856 129) (end 60.27 129) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 171.5398 69.3302) (end 170.27 70.6) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 205.5364 69.3302) (end 171.5398 69.3302) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 206.6267 70.4205) (end 205.5364 69.3302) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 210.9943 70.4205) (end 206.6267 70.4205) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 212.5676 68.8472) (end 210.9943 70.4205) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 258.5172 68.8472) (end 212.5676 68.8472) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 260.27 70.6) (end 258.5172 68.8472) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 56.7816 117.7046) (end 56.7816 109.3605) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 61.3856 122.3086) (end 56.7816 117.7046) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 61.3856 129) (end 61.3856 122.3086) (width 0.254) (layer B.Cu) (net 60))
  (segment (start 56.7816 100.2684) (end 57.92 99.13) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 56.7816 109.3605) (end 56.7816 100.2684) (width 0.254) (layer F.Cu) (net 60))
  (segment (start 188.9652 71.8352) (end 187.73 70.6) (width 0.254) (layer F.Cu) (net 61))
  (segment (start 196.4948 71.8352) (end 188.9652 71.8352) (width 0.254) (layer F.Cu) (net 61))
  (segment (start 197.73 70.6) (end 196.4948 71.8352) (width 0.254) (layer F.Cu) (net 61))
  (segment (start 88.9495 69.3805) (end 87.73 70.6) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 96.5105 69.3805) (end 88.9495 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 97.73 70.6) (end 96.5105 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 98.9495 69.3805) (end 97.73 70.6) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 106.5105 69.3805) (end 98.9495 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 107.73 70.6) (end 106.5105 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 108.9495 69.3805) (end 107.73 70.6) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 116.5105 69.3805) (end 108.9495 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 117.73 70.6) (end 116.5105 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 118.9495 69.3805) (end 117.73 70.6) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 126.5105 69.3805) (end 118.9495 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 127.73 70.6) (end 126.5105 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 128.9495 69.3805) (end 127.73 70.6) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 136.5105 69.3805) (end 128.9495 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 137.73 70.6) (end 136.5105 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 138.9495 69.3805) (end 137.73 70.6) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 146.5105 69.3805) (end 138.9495 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 147.73 70.6) (end 146.5105 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 148.9495 69.3805) (end 147.73 70.6) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 156.5105 69.3805) (end 148.9495 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 157.73 70.6) (end 156.5105 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 158.9495 69.3805) (end 157.73 70.6) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 166.5105 69.3805) (end 158.9495 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 167.73 70.6) (end 166.5105 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 168.9495 69.3805) (end 167.73 70.6) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 176.5105 69.3805) (end 168.9495 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 177.73 70.6) (end 176.5105 69.3805) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 186.4901 69.3601) (end 187.73 70.6) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 178.9699 69.3601) (end 186.4901 69.3601) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 177.73 70.6) (end 178.9699 69.3601) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 224.4891 109.5009) (end 222.86 111.13) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 224.4891 95.9211) (end 224.4891 109.5009) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 223.188 94.62) (end 224.4891 95.9211) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 222.568 94.62) (end 223.188 94.62) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 214.6246 86.6766) (end 222.568 94.62) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 214.6246 83.1806) (end 214.6246 86.6766) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 200.8244 69.3804) (end 214.6246 83.1806) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 198.9496 69.3804) (end 200.8244 69.3804) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 197.73 70.6) (end 198.9496 69.3804) (width 0.254) (layer B.Cu) (net 61))
  (segment (start 96.5104 86.4196) (end 97.73 85.2) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 88.9496 86.4196) (end 96.5104 86.4196) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 87.73 85.2) (end 88.9496 86.4196) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 98.9496 86.4196) (end 97.73 85.2) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 106.5104 86.4196) (end 98.9496 86.4196) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 107.73 85.2) (end 106.5104 86.4196) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 108.9605 86.4305) (end 107.73 85.2) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 116.4995 86.4305) (end 108.9605 86.4305) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 117.73 85.2) (end 116.4995 86.4305) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 221.3999 107.1299) (end 222.86 108.59) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 221.3999 95.4147) (end 221.3999 107.1299) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 215.4577 89.4725) (end 221.3999 95.4147) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 202.0025 89.4725) (end 215.4577 89.4725) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 197.73 85.2) (end 202.0025 89.4725) (width 0.254) (layer B.Cu) (net 62))
  (segment (start 138.9496 83.9804) (end 137.73 85.2) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 146.5104 83.9804) (end 138.9496 83.9804) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 147.73 85.2) (end 146.5104 83.9804) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 148.9943 86.4643) (end 147.73 85.2) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 156.4657 86.4643) (end 148.9943 86.4643) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 157.73 85.2) (end 156.4657 86.4643) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 158.9496 83.9804) (end 157.73 85.2) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 166.5104 83.9804) (end 158.9496 83.9804) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 167.73 85.2) (end 166.5104 83.9804) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 168.9943 86.4643) (end 167.73 85.2) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 176.4657 86.4643) (end 168.9943 86.4643) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 177.73 85.2) (end 176.4657 86.4643) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 178.9496 83.9804) (end 177.73 85.2) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 186.5104 83.9804) (end 178.9496 83.9804) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 187.73 85.2) (end 186.5104 83.9804) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 188.9887 83.9413) (end 187.73 85.2) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 196.4713 83.9413) (end 188.9887 83.9413) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 197.73 85.2) (end 196.4713 83.9413) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 126.5104 83.9804) (end 127.73 85.2) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 118.9496 83.9804) (end 126.5104 83.9804) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 117.73 85.2) (end 118.9496 83.9804) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 136.5104 86.4196) (end 137.73 85.2) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 128.9496 86.4196) (end 136.5104 86.4196) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 127.73 85.2) (end 128.9496 86.4196) (width 0.254) (layer F.Cu) (net 62))
  (segment (start 98.9835 98.5465) (end 97.73 99.8) (width 0.254) (layer B.Cu) (net 63))
  (segment (start 106.4765 98.5465) (end 98.9835 98.5465) (width 0.254) (layer B.Cu) (net 63))
  (segment (start 107.73 99.8) (end 106.4765 98.5465) (width 0.254) (layer B.Cu) (net 63))
  (segment (start 196.487 98.557) (end 197.73 99.8) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 188.973 98.557) (end 196.487 98.557) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 187.73 99.8) (end 188.973 98.557) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 223.9433 104.9667) (end 222.86 106.05) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 223.9433 103.0561) (end 223.9433 104.9667) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 223.1272 102.24) (end 223.9433 103.0561) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 200.17 102.24) (end 223.1272 102.24) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 197.73 99.8) (end 200.17 102.24) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 88.959 101.029) (end 87.73 99.8) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 96.501 101.029) (end 88.959 101.029) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 97.73 99.8) (end 96.501 101.029) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 176.5104 101.0196) (end 177.73 99.8) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 168.9496 101.0196) (end 176.5104 101.0196) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 167.73 99.8) (end 168.9496 101.0196) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 186.4749 98.5449) (end 187.73 99.8) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 178.9851 98.5449) (end 186.4749 98.5449) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 177.73 99.8) (end 178.9851 98.5449) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 128.9496 101.0196) (end 127.73 99.8) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 136.5104 101.0196) (end 128.9496 101.0196) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 137.73 99.8) (end 136.5104 101.0196) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 108.9503 101.0203) (end 107.73 99.8) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 116.5097 101.0203) (end 108.9503 101.0203) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 117.73 99.8) (end 116.5097 101.0203) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 126.5104 101.0196) (end 127.73 99.8) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 118.9496 101.0196) (end 126.5104 101.0196) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 117.73 99.8) (end 118.9496 101.0196) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 166.5031 98.5731) (end 167.73 99.8) (width 0.254) (layer B.Cu) (net 63))
  (segment (start 158.9569 98.5731) (end 166.5031 98.5731) (width 0.254) (layer B.Cu) (net 63))
  (segment (start 157.73 99.8) (end 158.9569 98.5731) (width 0.254) (layer B.Cu) (net 63))
  (segment (start 139.4579 98.0721) (end 137.73 99.8) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 146.0021 98.0721) (end 139.4579 98.0721) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 147.73 99.8) (end 146.0021 98.0721) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 148.9941 98.5359) (end 147.73 99.8) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 156.4659 98.5359) (end 148.9941 98.5359) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 157.73 99.8) (end 156.4659 98.5359) (width 0.254) (layer F.Cu) (net 63))
  (segment (start 148.9496 113.1804) (end 147.73 114.4) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 156.5104 113.1804) (end 148.9496 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 157.73 114.4) (end 156.5104 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 158.9522 115.6222) (end 157.73 114.4) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 166.5078 115.6222) (end 158.9522 115.6222) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 167.73 114.4) (end 166.5078 115.6222) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 178.9717 113.1583) (end 177.73 114.4) (width 0.254) (layer B.Cu) (net 64))
  (segment (start 186.4883 113.1583) (end 178.9717 113.1583) (width 0.254) (layer B.Cu) (net 64))
  (segment (start 187.73 114.4) (end 186.4883 113.1583) (width 0.254) (layer B.Cu) (net 64))
  (segment (start 196.4923 113.1623) (end 197.73 114.4) (width 0.254) (layer B.Cu) (net 64))
  (segment (start 188.9677 113.1623) (end 196.4923 113.1623) (width 0.254) (layer B.Cu) (net 64))
  (segment (start 187.73 114.4) (end 188.9677 113.1623) (width 0.254) (layer B.Cu) (net 64))
  (segment (start 118.9496 113.1804) (end 117.73 114.4) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 126.5104 113.1804) (end 118.9496 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 127.73 114.4) (end 126.5104 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 108.9496 113.1804) (end 107.73 114.4) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 116.5104 113.1804) (end 108.9496 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 117.73 114.4) (end 116.5104 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 168.9564 113.1736) (end 167.73 114.4) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 176.5036 113.1736) (end 168.9564 113.1736) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 177.73 114.4) (end 176.5036 113.1736) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 98.9496 113.1804) (end 97.73 114.4) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 106.5104 113.1804) (end 98.9496 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 107.73 114.4) (end 106.5104 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 88.9496 113.1804) (end 87.73 114.4) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 96.5104 113.1804) (end 88.9496 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 97.73 114.4) (end 96.5104 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 138.9496 113.1804) (end 137.73 114.4) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 146.5104 113.1804) (end 138.9496 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 147.73 114.4) (end 146.5104 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 128.9496 113.1804) (end 127.73 114.4) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 136.5104 113.1804) (end 128.9496 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 137.73 114.4) (end 136.5104 113.1804) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 218.9886 107.3814) (end 222.86 103.51) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 218.9886 107.3815) (end 218.9886 107.3814) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 204.7067 107.3815) (end 218.9886 107.3815) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 197.73 114.3582) (end 204.7067 107.3815) (width 0.254) (layer F.Cu) (net 64))
  (segment (start 197.73 114.4) (end 197.73 114.3582) (width 0.254) (layer F.Cu) (net 64))
  (via (at 211.7167 117.5345) (size 0.889) (layers F.Cu B.Cu) (net 65))
  (segment (start 138.9495 127.7805) (end 137.73 129) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 146.5105 127.7805) (end 138.9495 127.7805) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 147.73 129) (end 146.5105 127.7805) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 178.9495 127.7805) (end 177.73 129) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 186.5105 127.7805) (end 178.9495 127.7805) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 187.73 129) (end 186.5105 127.7805) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 166.5104 130.2196) (end 167.73 129) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 158.9496 130.2196) (end 166.5104 130.2196) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 157.73 129) (end 158.9496 130.2196) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 168.9496 130.2196) (end 167.73 129) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 176.5104 130.2196) (end 168.9496 130.2196) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 177.73 129) (end 176.5104 130.2196) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 156.5105 127.7805) (end 157.73 129) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 148.9495 127.7805) (end 156.5105 127.7805) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 147.73 129) (end 148.9495 127.7805) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 128.9719 127.7581) (end 127.73 129) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 136.4881 127.7581) (end 128.9719 127.7581) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 137.73 129) (end 136.4881 127.7581) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 98.9713 127.7587) (end 97.73 129) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 106.4887 127.7587) (end 98.9713 127.7587) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 107.73 129) (end 106.4887 127.7587) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 88.9496 127.7804) (end 87.73 129) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 96.5104 127.7804) (end 88.9496 127.7804) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 97.73 129) (end 96.5104 127.7804) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 188.9603 130.2303) (end 187.73 129) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 196.4997 130.2303) (end 188.9603 130.2303) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 197.73 129) (end 196.4997 130.2303) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 116.5104 130.2196) (end 117.73 129) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 108.9496 130.2196) (end 116.5104 130.2196) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 107.73 129) (end 108.9496 130.2196) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 118.9496 130.2196) (end 117.73 129) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 126.5104 130.2196) (end 118.9496 130.2196) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 127.73 129) (end 126.5104 130.2196) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 209.1955 117.5345) (end 211.7167 117.5345) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 197.73 129) (end 209.1955 117.5345) (width 0.254) (layer B.Cu) (net 65))
  (segment (start 224.5007 102.6107) (end 222.86 100.97) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 224.5007 105.9974) (end 224.5007 102.6107) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 223.1781 107.32) (end 224.5007 105.9974) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 221.9312 107.32) (end 223.1781 107.32) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 211.7167 117.5345) (end 221.9312 107.32) (width 0.254) (layer F.Cu) (net 65))
  (segment (start 237.73 77.9) (end 237.73 85.2) (width 0.254) (layer B.Cu) (net 66))
  (segment (start 237.73 85.2) (end 237.73 92.5) (width 0.254) (layer B.Cu) (net 66))
  (segment (start 237.73 92.5) (end 237.73 99.8) (width 0.254) (layer B.Cu) (net 66))
  (segment (start 237.73 99.8) (end 237.73 107.1) (width 0.254) (layer B.Cu) (net 66))
  (segment (start 257.73 85.2) (end 257.73 92.5) (width 0.254) (layer B.Cu) (net 66))
  (segment (start 257.73 77.9) (end 257.73 85.2) (width 0.254) (layer F.Cu) (net 66))
  (segment (start 237.73 107.1) (end 237.73 114.4) (width 0.254) (layer B.Cu) (net 66))
  (segment (start 237.73 114.4) (end 237.73 121.7) (width 0.254) (layer B.Cu) (net 66))
  (segment (start 256.5049 76.6749) (end 257.73 77.9) (width 0.254) (layer F.Cu) (net 66))
  (segment (start 256.5049 71.8251) (end 256.5049 76.6749) (width 0.254) (layer F.Cu) (net 66))
  (segment (start 256.5049 71.8251) (end 257.73 70.6) (width 0.254) (layer F.Cu) (net 66))
  (segment (start 237.73 73.0502) (end 238.9551 71.8251) (width 0.254) (layer F.Cu) (net 66))
  (segment (start 237.73 77.9) (end 237.73 73.0502) (width 0.254) (layer F.Cu) (net 66))
  (segment (start 237.73 70.6) (end 238.9551 71.8251) (width 0.254) (layer F.Cu) (net 66))
  (segment (start 238.9551 71.8251) (end 256.5049 71.8251) (width 0.254) (layer F.Cu) (net 66))
  (segment (start 224.23 99.8) (end 222.86 98.43) (width 0.254) (layer F.Cu) (net 66))
  (segment (start 237.73 99.8) (end 224.23 99.8) (width 0.254) (layer F.Cu) (net 66))
  (segment (start 257.73 114.4) (end 257.73 107.1) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 239.93 128.78) (end 239.93 131.32) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 28.9496 130.2196) (end 27.73 129) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 36.5104 130.2196) (end 28.9496 130.2196) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 37.73 129) (end 36.5104 130.2196) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 225.8905 118.1052) (end 223.8917 118.1052) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 236.12 128.3347) (end 225.8905 118.1052) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 236.12 131.736) (end 236.12 128.3347) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 236.896 132.512) (end 236.12 131.736) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 238.738 132.512) (end 236.896 132.512) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 239.93 131.32) (end 238.738 132.512) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 58.9496 127.7804) (end 57.73 129) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 66.5104 127.7804) (end 58.9496 127.7804) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 67.73 129) (end 66.5104 127.7804) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 48.9597 127.7703) (end 47.73 129) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 56.5003 127.7703) (end 48.9597 127.7703) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 57.73 129) (end 56.5003 127.7703) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 39.0049 130.2749) (end 37.73 129) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 46.4551 130.2749) (end 39.0049 130.2749) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 47.73 129) (end 46.4551 130.2749) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 69.4579 130.7279) (end 67.73 129) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 71.446 130.7279) (end 69.4579 130.7279) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 71.7637 130.4102) (end 71.446 130.7279) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 85.2546 130.4102) (end 71.7637 130.4102) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 86.1276 131.2832) (end 85.2546 130.4102) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 91.8681 131.2832) (end 86.1276 131.2832) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 97.5183 125.633) (end 91.8681 131.2832) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 161.6142 125.633) (end 97.5183 125.633) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 170.0493 117.1979) (end 161.6142 125.633) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 170.0493 117.1731) (end 170.0493 117.1979) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 170.5331 116.6893) (end 170.0493 117.1731) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 173.049 116.6893) (end 170.5331 116.6893) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 177.131 112.6073) (end 173.049 116.6893) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 214.4442 112.6073) (end 177.131 112.6073) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 219.9421 118.1052) (end 214.4442 112.6073) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 223.8917 118.1052) (end 219.9421 118.1052) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 223.8917 115.2401) (end 223.8917 118.1052) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 221.7524 113.1008) (end 223.8917 115.2401) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 221.7524 110.6961) (end 221.7524 113.1008) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 222.5885 109.86) (end 221.7524 110.6961) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 223.122 109.86) (end 222.5885 109.86) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 223.9609 109.0211) (end 223.122 109.86) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 223.9609 96.9909) (end 223.9609 109.0211) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 222.86 95.89) (end 223.9609 96.9909) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 257.73 107.1) (end 257.73 99.8) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 277.73 70.6) (end 277.73 77.9) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 277.73 77.9) (end 277.73 85.2) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 272.33 85.2) (end 257.73 99.8) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 277.73 85.2) (end 272.33 85.2) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 257.73 114.4) (end 257.73 121.7) (width 0.254) (layer B.Cu) (net 67))
  (segment (start 239 102.97) (end 257.73 121.7) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 239 99.336) (end 239 102.97) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 235.554 95.89) (end 239 99.336) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 222.86 95.89) (end 235.554 95.89) (width 0.254) (layer F.Cu) (net 67))
  (segment (start 66.5104 69.3804) (end 67.73 70.6) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 58.9496 69.3804) (end 66.5104 69.3804) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 57.73 70.6) (end 58.9496 69.3804) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 68.9496 69.3804) (end 67.73 70.6) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 76.5104 69.3804) (end 68.9496 69.3804) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 77.73 70.6) (end 76.5104 69.3804) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 28.9976 69.3324) (end 27.73 70.6) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 36.4624 69.3324) (end 28.9976 69.3324) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 37.73 70.6) (end 36.4624 69.3324) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 48.9976 69.3324) (end 47.73 70.6) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 56.4624 69.3324) (end 48.9976 69.3324) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 57.73 70.6) (end 56.4624 69.3324) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 38.9976 69.3324) (end 37.73 70.6) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 46.4624 69.3324) (end 38.9976 69.3324) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 47.73 70.6) (end 46.4624 69.3324) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 81.5189 72.3375) (end 81.5189 69.408) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 59.3711 94.4853) (end 81.5189 72.3375) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 59.3711 99.6096) (end 59.3711 94.4853) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 62.0804 102.3189) (end 59.3711 99.6096) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 65.6489 102.3189) (end 62.0804 102.3189) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 77.73 114.4) (end 65.6489 102.3189) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 78.9515 69.3785) (end 77.73 70.6) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 81.4894 69.3785) (end 78.9515 69.3785) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 81.5189 69.408) (end 81.4894 69.3785) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 242.47 131.32) (end 242.47 128.78) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 223.3435 89.7061) (end 221.7649 89.7061) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 236.5104 102.873) (end 223.3435 89.7061) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 236.5104 122.8204) (end 236.5104 102.873) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 242.47 128.78) (end 236.5104 122.8204) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 221.7649 89.5881) (end 221.7649 89.7061) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 199.9705 67.7937) (end 221.7649 89.5881) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 83.1332 67.7937) (end 199.9705 67.7937) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 81.5189 69.408) (end 83.1332 67.7937) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 221.7649 92.2549) (end 222.86 93.35) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 221.7649 89.7061) (end 221.7649 92.2549) (width 0.254) (layer B.Cu) (net 68))
  (segment (start 119 159.5) (end 109 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 109 159.5) (end 99 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 99 159.5) (end 89 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 119 159.5) (end 129 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 129 159.5) (end 139 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 139 159.5) (end 149 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 169 159.5) (end 179 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 179 159.5) (end 189 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 189 159.5) (end 199 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 149 159.5) (end 159 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 159 159.5) (end 169 159.5) (width 0.381) (layer F.Cu) (net 69))
  (segment (start 83.6994 134.0694) (end 82.71 133.08) (width 0.381) (layer B.Cu) (net 69))
  (segment (start 83.6994 152.4846) (end 83.6994 134.0694) (width 0.381) (layer B.Cu) (net 69))
  (segment (start 89 157.7852) (end 83.6994 152.4846) (width 0.381) (layer B.Cu) (net 69))
  (segment (start 89 159.5) (end 89 157.7852) (width 0.381) (layer B.Cu) (net 69))
  (segment (start 39 159.5) (end 49 159.5) (width 0.381) (layer F.Cu) (net 70))
  (segment (start 59 159.5) (end 69 159.5) (width 0.381) (layer F.Cu) (net 70))
  (segment (start 29 159.5) (end 39 159.5) (width 0.381) (layer F.Cu) (net 70))
  (segment (start 19.2122 133.7722) (end 14.94 129.5) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 19.2122 135.5578) (end 19.2122 133.7722) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 24.5925 140.9381) (end 19.2122 135.5578) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 24.5925 153.3777) (end 24.5925 140.9381) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 29 157.7852) (end 24.5925 153.3777) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 29 159.5) (end 29 157.7852) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 245.01 128.78) (end 245.01 131.32) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 143.5019 161.2148) (end 79 161.2148) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 149.0818 155.6349) (end 143.5019 161.2148) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 191.0458 155.6349) (end 149.0818 155.6349) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 194 152.6807) (end 191.0458 155.6349) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 194 143.03) (end 194 152.6807) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 202.5437 134.4863) (end 194 143.03) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 211.4032 134.4863) (end 202.5437 134.4863) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 213.9587 131.9308) (end 211.4032 134.4863) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 223.9137 131.9308) (end 213.9587 131.9308) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 225.0709 133.088) (end 223.9137 131.9308) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 243.242 133.088) (end 225.0709 133.088) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 245.01 131.32) (end 243.242 133.088) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 59 159.5) (end 49 159.5) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 79 159.5) (end 79 160.3574) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 79 160.3574) (end 79 161.2148) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 72.8422 160.3574) (end 71.9848 159.5) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 79 160.3574) (end 72.8422 160.3574) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 69 159.5) (end 71.9848 159.5) (width 0.381) (layer B.Cu) (net 70))
  (segment (start 219 159.5) (end 209 159.5) (width 0.381) (layer F.Cu) (net 71))
  (segment (start 229 159.5) (end 229 157.7852) (width 0.381) (layer B.Cu) (net 71))
  (segment (start 219 159.5) (end 219 157.7852) (width 0.381) (layer B.Cu) (net 71))
  (segment (start 224.0804 152.8656) (end 223.9196 152.8656) (width 0.381) (layer B.Cu) (net 71))
  (segment (start 229 157.7852) (end 224.0804 152.8656) (width 0.381) (layer B.Cu) (net 71))
  (segment (start 223.9196 134.5896) (end 223.9196 152.8656) (width 0.381) (layer B.Cu) (net 71))
  (segment (start 222.41 133.08) (end 223.9196 134.5896) (width 0.381) (layer B.Cu) (net 71))
  (segment (start 223.9196 152.8656) (end 219 157.7852) (width 0.381) (layer B.Cu) (net 71))
  (segment (start 229 159.5) (end 239 159.5) (width 0.381) (layer F.Cu) (net 71))
  (segment (start 259 159.5) (end 269 159.5) (width 0.381) (layer F.Cu) (net 71))
  (segment (start 269 159.5) (end 279 159.5) (width 0.381) (layer F.Cu) (net 71))
  (segment (start 239 159.5) (end 249 159.5) (width 0.381) (layer F.Cu) (net 71))
  (segment (start 249 159.5) (end 259 159.5) (width 0.381) (layer F.Cu) (net 71))
  (via (at 46.7355 117.1664) (size 0.889) (layers F.Cu B.Cu) (net 72))
  (segment (start 215.24 111.13) (end 214.1602 111.13) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 43.68 124) (end 42.41 125.27) (width 0.254) (layer B.Cu) (net 72))
  (segment (start 43.68 120.2219) (end 43.68 124) (width 0.254) (layer B.Cu) (net 72))
  (segment (start 46.7355 117.1664) (end 43.68 120.2219) (width 0.254) (layer B.Cu) (net 72))
  (segment (start 205.3363 119.9539) (end 214.1602 111.13) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 163.7895 119.9539) (end 205.3363 119.9539) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 163.2898 119.4542) (end 163.7895 119.9539) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 75.686 119.4542) (end 163.2898 119.4542) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 75.0777 120.0625) (end 75.686 119.4542) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 73.1045 120.0625) (end 75.0777 120.0625) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 70.7115 117.6695) (end 73.1045 120.0625) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 70.7115 117.4112) (end 70.7115 117.6695) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 67.3533 114.053) (end 70.7115 117.4112) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 49.8489 114.053) (end 67.3533 114.053) (width 0.254) (layer F.Cu) (net 72))
  (segment (start 46.7355 117.1664) (end 49.8489 114.053) (width 0.254) (layer F.Cu) (net 72))
  (via (at 46.7255 113.9784) (size 0.889) (layers F.Cu B.Cu) (net 73))
  (segment (start 41.14 119.5639) (end 46.7255 113.9784) (width 0.254) (layer B.Cu) (net 73))
  (segment (start 41.14 124) (end 41.14 119.5639) (width 0.254) (layer B.Cu) (net 73))
  (segment (start 39.87 125.27) (end 41.14 124) (width 0.254) (layer B.Cu) (net 73))
  (segment (start 204.396 119.434) (end 215.24 108.59) (width 0.254) (layer F.Cu) (net 73))
  (segment (start 164.8008 119.434) (end 204.396 119.434) (width 0.254) (layer F.Cu) (net 73))
  (segment (start 164.3127 118.9459) (end 164.8008 119.434) (width 0.254) (layer F.Cu) (net 73))
  (segment (start 75.4755 118.9459) (end 164.3127 118.9459) (width 0.254) (layer F.Cu) (net 73))
  (segment (start 74.8672 119.5542) (end 75.4755 118.9459) (width 0.254) (layer F.Cu) (net 73))
  (segment (start 73.315 119.5542) (end 74.8672 119.5542) (width 0.254) (layer F.Cu) (net 73))
  (segment (start 71.2198 117.459) (end 73.315 119.5542) (width 0.254) (layer F.Cu) (net 73))
  (segment (start 71.2198 117.2007) (end 71.2198 117.459) (width 0.254) (layer F.Cu) (net 73))
  (segment (start 67.5638 113.5447) (end 71.2198 117.2007) (width 0.254) (layer F.Cu) (net 73))
  (segment (start 47.1592 113.5447) (end 67.5638 113.5447) (width 0.254) (layer F.Cu) (net 73))
  (segment (start 46.7255 113.9784) (end 47.1592 113.5447) (width 0.254) (layer F.Cu) (net 73))
  (via (at 74.3516 118.7284) (size 0.889) (layers F.Cu B.Cu) (net 74))
  (segment (start 70.35 122.73) (end 74.3516 118.7284) (width 0.254) (layer B.Cu) (net 74))
  (segment (start 74.6581 118.4219) (end 74.3516 118.7284) (width 0.254) (layer F.Cu) (net 74))
  (segment (start 165.8133 118.4219) (end 74.6581 118.4219) (width 0.254) (layer F.Cu) (net 74))
  (segment (start 166.279 118.8876) (end 165.8133 118.4219) (width 0.254) (layer F.Cu) (net 74))
  (segment (start 189.6176 118.8876) (end 166.279 118.8876) (width 0.254) (layer F.Cu) (net 74))
  (segment (start 202.4552 106.05) (end 189.6176 118.8876) (width 0.254) (layer F.Cu) (net 74))
  (segment (start 215.24 106.05) (end 202.4552 106.05) (width 0.254) (layer F.Cu) (net 74))
  (via (at 73.5094 117.8863) (size 0.889) (layers F.Cu B.Cu) (net 75))
  (segment (start 69.189 122.2067) (end 73.5094 117.8863) (width 0.254) (layer B.Cu) (net 75))
  (segment (start 69.189 124.109) (end 69.189 122.2067) (width 0.254) (layer B.Cu) (net 75))
  (segment (start 70.35 125.27) (end 69.189 124.109) (width 0.254) (layer B.Cu) (net 75))
  (segment (start 166.7756 117.8863) (end 73.5094 117.8863) (width 0.254) (layer F.Cu) (net 75))
  (segment (start 167.2685 118.3792) (end 166.7756 117.8863) (width 0.254) (layer F.Cu) (net 75))
  (segment (start 188.0154 118.3792) (end 167.2685 118.3792) (width 0.254) (layer F.Cu) (net 75))
  (segment (start 202.8846 103.51) (end 188.0154 118.3792) (width 0.254) (layer F.Cu) (net 75))
  (segment (start 215.24 103.51) (end 202.8846 103.51) (width 0.254) (layer F.Cu) (net 75))
  (via (at 72.0456 117.117) (size 0.889) (layers F.Cu B.Cu) (net 76))
  (segment (start 71.7875 117.117) (end 72.0456 117.117) (width 0.254) (layer B.Cu) (net 76))
  (segment (start 66.6329 122.2716) (end 71.7875 117.117) (width 0.254) (layer B.Cu) (net 76))
  (segment (start 66.6329 124.0929) (end 66.6329 122.2716) (width 0.254) (layer B.Cu) (net 76))
  (segment (start 67.81 125.27) (end 66.6329 124.0929) (width 0.254) (layer B.Cu) (net 76))
  (segment (start 212.2913 98.0213) (end 215.24 100.97) (width 0.254) (layer F.Cu) (net 76))
  (segment (start 166.9503 98.0213) (end 212.2913 98.0213) (width 0.254) (layer F.Cu) (net 76))
  (segment (start 152.2996 112.672) (end 166.9503 98.0213) (width 0.254) (layer F.Cu) (net 76))
  (segment (start 77.7335 112.672) (end 152.2996 112.672) (width 0.254) (layer F.Cu) (net 76))
  (segment (start 74.3019 116.1036) (end 77.7335 112.672) (width 0.254) (layer F.Cu) (net 76))
  (segment (start 74.3019 116.256) (end 74.3019 116.1036) (width 0.254) (layer F.Cu) (net 76))
  (segment (start 73.5204 117.0375) (end 74.3019 116.256) (width 0.254) (layer F.Cu) (net 76))
  (segment (start 72.1251 117.0375) (end 73.5204 117.0375) (width 0.254) (layer F.Cu) (net 76))
  (segment (start 72.0456 117.117) (end 72.1251 117.0375) (width 0.254) (layer F.Cu) (net 76))
  (segment (start 215.24 99.2311) (end 215.24 98.43) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 203.3834 111.0877) (end 215.24 99.2311) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 176.5976 111.0877) (end 203.3834 111.0877) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 171.5043 116.181) (end 176.5976 111.0877) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 170.3226 116.181) (end 171.5043 116.181) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 169.541 116.9626) (end 170.3226 116.181) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 169.541 116.9874) (end 169.541 116.9626) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 161.7612 124.7672) (end 169.541 116.9874) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 97.6652 124.7672) (end 161.7612 124.7672) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 91.6673 130.7651) (end 97.6652 124.7672) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 86.3283 130.7651) (end 91.6673 130.7651) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 85.4209 129.8577) (end 86.3283 130.7651) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 71.3431 129.8577) (end 85.4209 129.8577) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 70.9812 130.2196) (end 71.3431 129.8577) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 69.7306 130.2196) (end 70.9812 130.2196) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 68.9496 129.4386) (end 69.7306 130.2196) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 68.9496 128.4343) (end 68.9496 129.4386) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 68.1614 127.6461) (end 68.9496 128.4343) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 65.1061 127.6461) (end 68.1614 127.6461) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 62.73 125.27) (end 65.1061 127.6461) (width 0.254) (layer B.Cu) (net 77))
  (segment (start 166 95.89) (end 215.24 95.89) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 160.8205 101.0695) (end 166 95.89) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 143.4703 101.0695) (end 160.8205 101.0695) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 140.9812 98.5804) (end 143.4703 101.0695) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 139.7115 98.5804) (end 140.9812 98.5804) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 138.9496 99.3423) (end 139.7115 98.5804) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 138.9496 100.3221) (end 138.9496 99.3423) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 128.537 110.7347) (end 138.9496 100.3221) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 78.9357 110.7347) (end 128.537 110.7347) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 73.7936 115.8768) (end 78.9357 110.7347) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 73.7936 116.0455) (end 73.7936 115.8768) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 73.3099 116.5292) (end 73.7936 116.0455) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 72.6258 116.5292) (end 73.3099 116.5292) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 69.0864 112.9898) (end 72.6258 116.5292) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 49.8972 112.9898) (end 69.0864 112.9898) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 43.95 107.0426) (end 49.8972 112.9898) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 43.95 106.4301) (end 43.95 107.0426) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 43.1391 105.6192) (end 43.95 106.4301) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 42.2341 105.6192) (end 43.1391 105.6192) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 41.571 106.2823) (end 42.2341 105.6192) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 41.571 121.891) (end 41.571 106.2823) (width 0.254) (layer F.Cu) (net 78))
  (segment (start 42.41 122.73) (end 41.571 121.891) (width 0.254) (layer F.Cu) (net 78))
  (via (at 72.9678 115.7034) (size 0.889) (layers F.Cu B.Cu) (net 79))
  (segment (start 85.9 102.7712) (end 72.9678 115.7034) (width 0.254) (layer F.Cu) (net 79))
  (segment (start 100.8346 102.7712) (end 85.9 102.7712) (width 0.254) (layer F.Cu) (net 79))
  (segment (start 110.2558 93.35) (end 100.8346 102.7712) (width 0.254) (layer F.Cu) (net 79))
  (segment (start 215.24 93.35) (end 110.2558 93.35) (width 0.254) (layer F.Cu) (net 79))
  (segment (start 75.1941 120.4259) (end 72.89 122.73) (width 0.254) (layer B.Cu) (net 79))
  (segment (start 75.1941 117.9297) (end 75.1941 120.4259) (width 0.254) (layer B.Cu) (net 79))
  (segment (start 72.9678 115.7034) (end 75.1941 117.9297) (width 0.254) (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)
      )
    )
  )
)
Deleted hardware/pdp8i/PDP8.pro.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
























































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
update=17/05/2015 11:44:30
version=1
last_client=eeschema
[cvpcb]
version=1
NetIExt=net
[cvpcb/libraries]
EquName1=devcms
[pcbnew]
version=1
LastNetListRead=
UseCmpFile=1
PadDrill=0.600000000000
PadDrillOvalY=0.600000000000
PadSizeH=1.500000000000
PadSizeV=1.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.200000000000
BoardOutlineThickness=0.100000000000
ModuleOutlineThickness=0.150000000000
[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
[general]
version=1
[eeschema]
version=1
LibDir=customlibraries
NetFmtName=
RptD_X=0
RptD_Y=100
RptLab=1
LabSize=60
[eeschema/libraries]
LibName1=power
LibName2=device
LibName3=transistors
LibName4=conn
LibName5=linear
LibName6=regul
LibName7=74xx
LibName8=cmos4000
LibName9=adc-dac
LibName10=memory
LibName11=xilinx
LibName12=special
LibName13=microcontrollers
LibName14=dsp
LibName15=microchip
LibName16=analog_switches
LibName17=motorola
LibName18=texas
LibName19=intel
LibName20=audio
LibName21=interface
LibName22=digital-audio
LibName23=philips
LibName24=display
LibName25=cypress
LibName26=siliconi
LibName27=opto
LibName28=atmel
LibName29=contrib
LibName30=valves
LibName31=pdp8_library
Deleted hardware/pdp8i/PDP8.rules.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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)
    )
  )
)
Deleted hardware/pdp8i/PDP8.sch.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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-cache
EELAYER 27 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date "11 may 2015"
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
col1a
Text GLabel 800  1400 0    60   Input ~ 0
col2a
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 2800 4150
F 0 "R1" V 2880 4150 40  0000 C CNN
F 1 "390" V 2807 4151 40  0000 C CNN
F 2 "~" V 2730 4150 30  0000 C CNN
F 3 "~" H 2800 4150 30  0000 C CNN
	1    2800 4150
	1    0    0    -1  
$EndComp
$Comp
L R R2
U 1 1 5490834A
P 2800 5700
F 0 "R2" V 2880 5700 40  0000 C CNN
F 1 "390" V 2807 5701 40  0000 C CNN
F 2 "~" V 2730 5700 30  0000 C CNN
F 3 "~" H 2800 5700 30  0000 C CNN
	1    2800 5700
	-1   0    0    1   
$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 54B19131
P 2300 2600
F 0 "#PWR01" H 2300 2600 30  0001 C CNN
F 1 "GND" H 2300 2530 30  0001 C CNN
F 2 "" H 2300 2600 60  0000 C CNN
F 3 "" H 2300 2600 60  0000 C CNN
	1    2300 2600
	0    -1   -1   0   
$EndComp
$Comp
L GND #PWR02
U 1 1 54B1913E
P 2300 2100
F 0 "#PWR02" 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 #PWR03
U 1 1 54B19150
P 1400 1600
F 0 "#PWR03" H 1400 1600 30  0001 C CNN
F 1 "GND" H 1400 1530 30  0001 C CNN
F 2 "" H 1400 1600 60  0000 C CNN
F 3 "" H 1400 1600 60  0000 C CNN
	1    1400 1600
	0    1    1    0   
$EndComp
$Comp
L GND #PWR04
U 1 1 54B19156
P 2300 1400
F 0 "#PWR04" 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
$Comp
L GND #PWR05
U 1 1 54B19903
P 1400 3100
F 0 "#PWR05" H 1400 3100 30  0001 C CNN
F 1 "GND" H 1400 3030 30  0001 C CNN
F 2 "" H 1400 3100 60  0000 C CNN
F 3 "" H 1400 3100 60  0000 C CNN
	1    1400 3100
	0    1    1    0   
$EndComp
NoConn ~ 2250 2800
$Comp
L +3.3V #PWR06
U 1 1 54B1C371
P 1350 1100
F 0 "#PWR06" 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 #PWR07
U 1 1 54B1C4F8
P 4750 2550
F 0 "#PWR07" 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 #PWR08
U 1 1 54BCFC39
P 2400 1100
F 0 "#PWR08" 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 2750 1500 2    60   Input ~ 0
TX
Text GLabel 2750 1600 2    60   Input ~ 0
RX
Text GLabel 1350 2900 0    60   Input ~ 0
SPARE_IO
Text GLabel 2300 7600 0    60   Input ~ 0
TX
Text GLabel 2300 7500 0    60   Input ~ 0
RX
$Comp
L GND #PWR09
U 1 1 54BD292E
P 2850 7100
F 0 "#PWR09" H 2850 7100 30  0001 C CNN
F 1 "GND" H 2850 7030 30  0001 C CNN
F 2 "" H 2850 7100 60  0000 C CNN
F 3 "" H 2850 7100 60  0000 C CNN
	1    2850 7100
	-1   0    0    1   
$EndComp
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 #PWR010
U 1 1 54BD75EA
P 3400 2500
F 0 "#PWR010" 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 CONN_20X2 P3
U 1 1 554E0D39
P 1650 5050
F 0 "P3" H 1650 6100 60  0000 C CNN
F 1 "EXPANSION_20X2" V 1650 5050 50  0000 C CNN
F 2 "" H 1650 5050 60  0000 C CNN
F 3 "" H 1650 5050 60  0000 C CNN
	1    1650 5050
	1    0    0    -1  
$EndComp
$Comp
L +5V #PWR011
U 1 1 554E0D4F
P 1100 4100
F 0 "#PWR011" H 1100 4190 20  0001 C CNN
F 1 "+5V" H 1100 4190 30  0000 C CNN
F 2 "" H 1100 4100 60  0000 C CNN
F 3 "" H 1100 4100 60  0000 C CNN
	1    1100 4100
	0    -1   -1   0   
$EndComp
NoConn ~ 1250 4200
NoConn ~ 2050 4200
$Comp
L +3.3V #PWR012
U 1 1 554E0D7A
P 1100 4300
F 0 "#PWR012" H 1100 4260 30  0001 C CNN
F 1 "+3.3V" H 1100 4410 30  0000 C CNN
F 2 "" H 1100 4300 60  0000 C CNN
F 3 "" H 1100 4300 60  0000 C CNN
	1    1100 4300
	0    -1   -1   0   
$EndComp
$Comp
L GND #PWR013
U 1 1 554E0D8A
P 1100 4400
F 0 "#PWR013" H 1100 4400 30  0001 C CNN
F 1 "GND" H 1100 4330 30  0001 C CNN
F 2 "" H 1100 4400 60  0000 C CNN
F 3 "" H 1100 4400 60  0000 C CNN
	1    1100 4400
	0    1    1    0   
$EndComp
Text GLabel 1100 4800 0    60   Input ~ 0
SPARE_IO
Text GLabel 1100 4500 0    60   Input ~ 0
led7
Text GLabel 1100 4600 0    60   Input ~ 0
led8
Text GLabel 1100 4900 0    60   Input ~ 0
col1
Text GLabel 1100 5000 0    60   Input ~ 0
col2
Text GLabel 1100 5100 0    60   Input ~ 0
col3
Text GLabel 1100 5200 0    60   Input ~ 0
col4
Text GLabel 1100 5300 0    60   Input ~ 0
col5
Text GLabel 1100 5400 0    60   Input ~ 0
col6
Text GLabel 1100 5500 0    60   Input ~ 0
col7
Text GLabel 1100 5600 0    60   Input ~ 0
col8
Text GLabel 1100 5700 0    60   Input ~ 0
col9
Text GLabel 1100 5800 0    60   Input ~ 0
col10
Text GLabel 1100 5900 0    60   Input ~ 0
col11
Text GLabel 1100 6000 0    60   Input ~ 0
col12
Text GLabel 1100 4700 0    60   Input ~ 0
row2
$Comp
L CONN_4 P5
U 1 1 554E5206
P 3250 7450
F 0 "P5" V 3200 7450 50  0000 C CNN
F 1 "SERIAL 5V TTL" V 3300 7450 50  0000 C CNN
F 2 "" H 3250 7450 60  0000 C CNN
F 3 "" H 3250 7450 60  0000 C CNN
	1    3250 7450
	1    0    0    -1  
$EndComp
$Comp
L +5V #PWR014
U 1 1 554E5213
P 2800 7400
F 0 "#PWR014" H 2800 7490 20  0001 C CNN
F 1 "+5V" H 2800 7490 30  0000 C CNN
F 2 "" H 2800 7400 60  0000 C CNN
F 3 "" H 2800 7400 60  0000 C CNN
	1    2800 7400
	0    -1   -1   0   
$EndComp
$Comp
L R R_S1
U 1 1 554E5219
P 2600 7500
F 0 "R_S1" V 2680 7500 40  0000 C CNN
F 1 "300" V 2607 7501 40  0000 C CNN
F 2 "~" V 2530 7500 30  0000 C CNN
F 3 "~" H 2600 7500 30  0000 C CNN
	1    2600 7500
	0    1    1    0   
$EndComp
$Comp
L R R_S2
U 1 1 554E5233
P 2600 7300
F 0 "R_S2" V 2680 7300 40  0000 C CNN
F 1 "620" V 2607 7301 40  0000 C CNN
F 2 "~" V 2530 7300 30  0000 C CNN
F 3 "~" H 2600 7300 30  0000 C CNN
	1    2600 7300
	0    1    1    0   
$EndComp
Text GLabel 2800 3850 1    60   Input ~ 0
col1
Text GLabel 2800 6000 3    60   Input ~ 0
col2
Text GLabel 2700 4400 1    60   Input ~ 0
col1a
Text GLabel 2700 5450 3    60   Input ~ 0
col2a
Text GLabel 2900 4400 1    60   Input ~ 0
TX
Text GLabel 2900 5450 3    60   Input ~ 0
RX
Text Notes 1100 3700 0    31   ~ 0
2 Expansion ports
Text Notes 2350 6250 1    31   ~ 0
Serial Port Option jumper.\nWarning: enabling Serial Port requires modification on Raspberry Pi.\nWarning2: circuit board traces 1-2 are added\non the PiDP circuit board to enable default option \n(no serial port, unmodified RPI). Cut traces and \njumper 2-3 to enable serial port after \nmodifying the RPi.
Text Notes 2250 6800 0    31   ~ 0
5V TTL compatible serial port (option). \nWarning: requires mod on RPi (remove R23/24)\n               & trace cut/jumper on PiDP\nWarning: do not install resistors R_S1/R_S2 until \n                this mod has been done\n
$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:
$Comp
L CONN_3 J_COL1
U 1 1 554F46DF
P 2800 4800
F 0 "J_COL1" V 2750 4800 50  0000 C CNN
F 1 "CONN_3" V 2850 4800 40  0000 C CNN
F 2 "" H 2800 4800 60  0000 C CNN
F 3 "" H 2800 4800 60  0000 C CNN
	1    2800 4800
	0    -1   1    0   
$EndComp
$Comp
L CONN_3 J_COL2
U 1 1 554F46EE
P 2800 5050
F 0 "J_COL2" V 2750 5050 50  0000 C CNN
F 1 "CONN_3" V 2850 5050 40  0000 C CNN
F 2 "" H 2800 5050 60  0000 C CNN
F 3 "" H 2800 5050 60  0000 C CNN
	1    2800 5050
	0    -1   -1   0   
$EndComp
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
	2250 2600 2300 2600
Wire Wire Line
	1450 1600 1400 1600
Wire Wire Line
	1400 3100 1450 3100
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
	1350 2900 1450 2900
Wire Wire Line
	800  3000 1450 3000
Wire Wire Line
	2250 1500 2750 1500
Wire Wire Line
	2250 1600 2750 1600
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
Wire Wire Line
	2850 7100 2850 7300
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
	1100 4100 2050 4100
Connection ~ 1250 4100
Wire Wire Line
	1100 4300 2050 4300
Connection ~ 1250 4300
Wire Wire Line
	1100 4400 2050 4400
Connection ~ 1250 4400
Wire Wire Line
	1100 4500 2050 4500
Connection ~ 1250 4500
Wire Wire Line
	1100 4600 2050 4600
Connection ~ 1250 4600
Wire Wire Line
	1100 4700 2050 4700
Connection ~ 1250 4700
Connection ~ 1250 4800
Wire Wire Line
	1100 4900 2050 4900
Connection ~ 1250 4900
Wire Wire Line
	1100 4800 2050 4800
Wire Wire Line
	1100 5000 2050 5000
Connection ~ 1250 5000
Wire Wire Line
	1100 5100 2050 5100
Connection ~ 1250 5100
Wire Wire Line
	1100 5200 2050 5200
Connection ~ 1250 5200
Wire Wire Line
	1100 5300 2050 5300
Connection ~ 1250 5300
Wire Wire Line
	1100 5400 2050 5400
Connection ~ 1250 5400
Wire Wire Line
	1100 5500 2050 5500
Connection ~ 1250 5500
Wire Wire Line
	1100 5600 2050 5600
Connection ~ 1250 5600
Wire Wire Line
	1100 5700 2050 5700
Connection ~ 1250 5700
Wire Wire Line
	1100 5800 2050 5800
Connection ~ 1250 5800
Wire Wire Line
	1100 5900 2050 5900
Connection ~ 1250 5900
Wire Wire Line
	1100 6000 2050 6000
Connection ~ 1250 6000
Wire Wire Line
	2300 7600 2900 7600
Wire Wire Line
	2850 7500 2900 7500
Wire Wire Line
	2800 7400 2900 7400
Wire Wire Line
	2850 7300 2900 7300
Wire Wire Line
	2350 7500 2300 7500
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 Notes Line
	1750 6650 3600 6650
Wire Notes Line
	3600 6650 3600 7700
Wire Notes Line
	3600 7700 1800 7700
Wire Notes Line
	1800 7700 1800 6650
Wire Notes Line
	2250 6300 3000 6300
Wire Notes Line
	3000 6300 3000 3550
Wire Notes Line
	3000 3550 2250 3550
Wire Notes Line
	2250 3550 2250 6300
Wire Wire Line
	2700 5400 2700 5450
Wire Wire Line
	2800 5400 2800 5450
Wire Wire Line
	2900 5400 2900 5450
Wire Wire Line
	2800 5950 2800 6000
Wire Wire Line
	2800 3850 2800 3900
Wire Wire Line
	2700 4400 2700 4450
Wire Wire Line
	2800 4400 2800 4450
Wire Wire Line
	2900 4400 2900 4450
Wire Wire Line
	2900 7500 2900 7450
Wire Wire Line
	2900 7450 2350 7450
Wire Wire Line
	2350 7450 2350 7300
Wire Wire Line
	1450 1300 800  1300
Wire Wire Line
	1350 1200 1450 1200
NoConn ~ 1450 2000
Wire Wire Line
	2900 4450 2800 4450
Wire Wire Line
	2800 5400 2900 5400
Wire Wire Line
	3400 2400 3500 2400
Wire Wire Line
	3500 2400 3500 2600
Wire Wire Line
	3500 2600 3800 2600
Wire Wire Line
	3800 2600 3800 2400
$EndSCHEMATC
Deleted hardware/pdp8i/PDP8.ses.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

(session PDP8.ses
  (base_design PDP8.dsn)
  (placement
    (resolution um 10)
    (component R3
      (place R9 579200 -1029400 back 270)
      (place R1 376000 -1029400 back 90)
      (place R2 401400 -1029400 back 90)
      (place R3 426800 -1029400 back 90)
      (place R4 452200 -1029400 back 90)
      (place R5 477600 -1029400 back 90)
      (place R6 503000 -1029400 back 90)
      (place R7 528400 -1029400 back 270)
      (place R8 553800 -1029400 back 270)
      (place R10 604600 -1029400 back 270)
      (place R11 630000 -1029400 back 270)
      (place R12 655400 -1029400 back 270)
      (place R_ROW1 789000 -1330800 front 0)
      (place R_ROW2 187500 -1295000 front 180)
      (place R_ROW3 2186000 -1330800 front 0)
      (place R_S1 187500 -1330000 front 0)
      (place R_S2 187500 -1365000 front 0)
    )
    (component "DIP-18__300"
      (place P2 2190500 -1009700 back 270)
    )
    (component 1pin
      (place M1 130000 -680000 front 0)
      (place M2 130000 -1590000 front 0)
      (place M3 2850000 -680000 front 0)
      (place M4 2860000 -1590000 front 0)
      (place M5 2080000 -680000 front 0)
      (place M6 2850000 -1320000 front 0)
      (place M7 2080000 -1320000 front 0)
    )
    (component D2
      (place D23 2490000 -1365000 front 0)
      (place D24 2590000 -1365000 front 0)
      (place D22 2390000 -1365000 front 0)
      (place D25 2690000 -1365000 front 0)
      (place D26 2790000 -1365000 front 0)
      (place D12 1390000 -1365000 front 0)
      (place D2 390000 -1365000 front 0)
      (place D3 490000 -1365000 front 0)
      (place D4 590000 -1365000 front 0)
      (place D5 690000 -1365000 front 0)
      (place D6 790000 -1365000 front 0)
      (place D7 890000 -1365000 front 0)
      (place D8 990000 -1365000 front 0)
      (place D9 1090000 -1365000 front 0)
      (place D10 1190000 -1365000 front 0)
      (place D11 1290000 -1365000 front 0)
      (place D1 290000 -1365000 front 0)
      (place D13 1490000 -1365000 front 0)
      (place D14 1590000 -1365000 front 0)
      (place D15 1690000 -1365000 front 0)
      (place D16 1790000 -1365000 front 0)
      (place D17 1890000 -1365000 front 0)
      (place D18 1990000 -1365000 front 0)
      (place D19 2090000 -1365000 front 0)
      (place D20 2190000 -1365000 front 0)
      (place D21 2290000 -1365000 front 0)
    )
    (component RASPI_BPLUS_MIRRORED
      (place P1 640000 -1240000 back 0)
    )
    (component D3
      (place DZ1 2190000 -1170000 front 0)
    )
    (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 -1217000 front 0)
      (place DIOT1 2390000 -1144000 front 0)
      (place DJMP1 2390000 -1071000 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 SW_KND2_PDP2
      (place SW6 790000 -1595000 front 0)
      (place SW5 690000 -1595000 front 0)
      (place SW4 590000 -1595000 front 0)
      (place SW3 490000 -1595000 front 0)
      (place SW2 390000 -1595000 front 0)
      (place SW1 290000 -1595000 front 0)
      (place SW18 1990000 -1595000 front 0)
      (place SW17 1890000 -1595000 front 0)
      (place SW15 1690000 -1595000 front 0)
      (place SW14 1590000 -1595000 front 0)
      (place SW13 1490000 -1595000 front 0)
      (place SW12 1390000 -1595000 front 0)
      (place SW19 2090000 -1595000 front 0)
      (place SW20 2190000 -1595000 front 0)
      (place SW16 1790000 -1595000 front 0)
      (place SW22 2390000 -1595000 front 0)
      (place SW23 2490000 -1595000 front 0)
      (place SW24 2590000 -1595000 front 0)
      (place SW25 2690000 -1595000 front 0)
      (place SW26 2790000 -1595000 front 0)
      (place SW7 890000 -1595000 front 0)
      (place SW8 990000 -1595000 front 0)
      (place SW9 1090000 -1595000 front 0)
      (place SW10 1190000 -1595000 front 0)
      (place SW11 1290000 -1595000 front 0)
      (place SW21 2290000 -1595000 front 0)
    )
    (component PIN_ARRAY_4x1
      (place P5 115000 -1360000 front 270)
    )
    (component PIN_ARRAY_20X2
      (place P3 2539000 -1300500 back 180)
    )
    (component "LED-3-StrEight"
      (place DPAUSE2 2590000 -1144000 front 0)
      (place DRUN2 2590000 -1217000 front 0)
    )
    (component PIN_ARRAY_3X1
      (place J_COL1 643000 -1118000 back 180)
      (place J_COL2 643000 -1152000 back 180)
    )
  )
  (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 F.Cu 3810
            893368 -1227300
            913651 -1207017
            1290368 -1207017
            1308107 -1224756
            1308107 -1239060
            1377069 -1308022
            2011889 -1308022
            2044180 -1275731
            2336431 -1275731
            2348500 -1287800
          )
        )
        (wire
          (path F.Cu 3810
            881300 -1227300
            893368 -1227300
          )
        )
        (wire
          (path B.Cu 3810
            2348500 -1287800
            2348500 -1313200
          )
        )
      )
      (net +5V
        (wire
          (path F.Cu 3810
            2151900 -1170000
            2116585 -1205315
            1384946 -1205315
            1379892 -1200261
            886410 -1200261
            869231 -1217440
            869231 -1240631
            881300 -1252700
          )
        )
        (wire
          (path F.Cu 3810
            855900 -1252700
            761300 -1347300
            115000 -1347300
          )
        )
        (wire
          (path B.Cu 3810
            881300 -1252700
            855900 -1252700
          )
        )
        (wire
          (path F.Cu 3810
            2297700 -1287800
            2297700 -1299868
          )
        )
        (wire
          (path F.Cu 3810
            2297700 -1313200
            2297700 -1299868
          )
        )
        (wire
          (path B.Cu 3810
            2297700 -1287800
            2285632 -1287800
          )
        )
        (wire
          (path B.Cu 3810
            2285632 -1287800
            2167832 -1170000
            2151900 -1170000
          )
        )
      )
      (net GND
        (wire
          (path B.Cu 3810
            2373900 -1287800
            2298356 -1212256
            2298356 -977856
            2228600 -908100
          )
        )
        (wire
          (path B.Cu 3810
            2373900 -1313200
            2373900 -1287800
          )
        )
        (wire
          (path B.Cu 3810
            792400 -1257101
            784638 -1264863
            664863 -1264863
            652700 -1252700
          )
        )
        (wire
          (path B.Cu 3810
            792400 -1257101
            792400 -1240000
            779700 -1227300
          )
        )
        (wire
          (path B.Cu 3810
            792400 -1257101
            800256 -1264957
            818243 -1264957
            830500 -1252700
          )
        )
        (wire
          (path B.Cu 3810
            115000 -1321900
            127068 -1321900
          )
        )
        (wire
          (path B.Cu 3810
            127068 -1321900
            130612 -1318356
            154053 -1318356
            160929 -1325232
            160929 -1353471
            149400 -1365000
          )
        )
        (wire
          (path F.Cu 3810
            398700 -1227300
            411400 -1240000
            513000 -1240000
            525700 -1252700
          )
        )
        (wire
          (path F.Cu 3810
            364101 -1206624
            378024 -1206624
            398700 -1227300
          )
        )
        (wire
          (path F.Cu 3810
            652700 -1252700
            640631 -1264769
            537769 -1264769
            525700 -1252700
          )
        )
        (wire
          (path F.Cu 3810
            127068 -1321900
            139384 -1321900
            254660 -1206624
            364101 -1206624
          )
        )
        (wire
          (path F.Cu 3810
            2228600 -908100
            2216749 -919951
            1100418 -919951
            1019637 -839170
            511529 -839170
            364101 -986598
            364101 -1206624
          )
        )
        (wire
          (path F.Cu 3810
            115000 -1321900
            127068 -1321900
          )
        )
      )
      (net "N-0000023"
        (wire
          (path B.Cu 2540
            2228100 -1170000
            2228100 -1159202
          )
        )
        (wire
          (path B.Cu 2540
            2228100 -1159202
            2167001 -1098103
            2167001 -922701
            2152400 -908100
          )
        )
      )
      (net "N-0000028"
        (wire
          (path F.Cu 2540
            643000 -1118000
            631567 -1106567
            551911 -1106567
            515700 -1070356
            515700 -1064381
            502323 -1051004
            392496 -1051004
            376000 -1067500
          )
        )
      )
      (net "N-0000029"
        (wire
          (path B.Cu 2540
            643000 -1152000
            631566 -1140566
            619213 -1140566
            606166 -1127519
            606166 -1107927
            626625 -1087468
            650924 -1087468
            666200 -1072192
            666200 -1062830
            644354 -1040984
            427916 -1040984
            401400 -1067500
          )
        )
      )
      (net "N-0000035"
        (wire
          (path F.Cu 2540
            115000 -1372700
            118419 -1376119
            214481 -1376119
            225600 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            115000 -1372700
            149400 -1338300
            149400 -1330000
          )
        )
      )
      (net "N-0000039"
        (wire
          (path B.Cu 2540
            576500 -1252700
            563800 -1240000
            563800 -1223523
            503000 -1162723
            503000 -1067500
          )
        )
      )
      (net "N-0000040"
        (wire
          (path B.Cu 2540
            601900 -1227300
            542629 -1168029
            542629 -1063326
            549319 -1056636
            593736 -1056636
            604600 -1067500
          )
        )
      )
      (net "N-0000041"
        (wire
          (path B.Cu 2540
            449500 -1252700
            458311 -1252700
            490000 -1284389
            490000 -1294620
            526180 -1330800
            750900 -1330800
          )
        )
      )
      (net "N-0000042"
        (wire
          (path B.Cu 2540
            500300 -1252700
            514266 -1238734
            530434 -1238734
            537535 -1231633
            537535 -1220894
            492201 -1175560
            492201 -1062927
            503589 -1051539
            614039 -1051539
            630000 -1067500
          )
        )
      )
      (net "N-0000043"
        (wire
          (path B.Cu 2540
            601900 -1252700
            589200 -1240000
            589200 -1221790
            528400 -1160990
            528400 -1067500
          )
        )
      )
      (net "N-0000046"
        (wire
          (path F.Cu 2540
            754300 -1252700
            765788 -1241212
            860806 -1241212
            868600 -1249006
            868600 -1256571
            884342 -1272313
            977570 -1272313
            990000 -1284743
            990000 -1294994
            1008747 -1313741
            2032306 -1313741
            2062707 -1344142
            2105187 -1344142
            2118529 -1330800
            2147900 -1330800
          )
        )
      )
      (net "N-0000048"
        (wire
          (path B.Cu 2540
            655400 -1067500
            633967 -1046067
            432397 -1046067
            415681 -1062783
            415681 -1072465
            475614 -1132398
            475614 -1226586
            474900 -1227300
          )
        )
      )
      (net "N-0000049"
        (wire
          (path B.Cu 2540
            500300 -1227300
            480697 -1207697
            480697 -1112509
            441005 -1072817
            441005 -1063223
            447939 -1056289
            466389 -1056289
            477600 -1067500
          )
        )
      )
      (net "N-0000050"
        (wire
          (path B.Cu 2540
            525700 -1227300
            485781 -1187381
            485781 -1101081
            452200 -1067500
          )
        )
      )
      (net "N-0000053"
        (wire
          (path B.Cu 2540
            790000 -1539200
            790000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            790000 -1522687
            825560 -1487127
            825560 -1365000
          )
        )
      )
      (net "N-0000054"
        (wire
          (path B.Cu 2540
            627300 -1227300
            587011 -1187011
            587011 -1100711
            553800 -1067500
          )
        )
      )
      (net "N-0000055"
        (wire
          (path B.Cu 2540
            652700 -1227300
            594636 -1169236
            594636 -1082936
            579200 -1067500
          )
        )
      )
      (net "N-0000056"
        (wire
          (path F.Cu 2540
            754300 -1227300
            740334 -1241266
            698766 -1241266
            690800 -1249232
            690800 -1256341
            674806 -1272335
            248265 -1272335
            225600 -1295000
          )
        )
      )
      (net "N-0000057"
        (wire
          (path F.Cu 2540
            426800 -1067500
            426800 -1142787
            496975 -1212962
            790762 -1212962
            805100 -1227300
          )
        )
      )
      (net "N-0000059"
        (wire
          (path B.Cu 2540
            690000 -1539200
            690000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            690000 -1522687
            725560 -1487127
            725560 -1365000
          )
        )
      )
      (net "N-0000060"
        (wire
          (path B.Cu 2540
            590000 -1539200
            590000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            590000 -1522687
            625560 -1487127
            625560 -1365000
          )
        )
      )
      (net "N-0000061"
        (wire
          (path B.Cu 2540
            490000 -1539200
            490000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            490000 -1522687
            525560 -1487127
            525560 -1365000
          )
        )
      )
      (net "N-0000062"
        (wire
          (path F.Cu 2540
            390000 -1539200
            390000 -1522687
          )
        )
        (wire
          (path F.Cu 2540
            390000 -1522687
            425560 -1487127
            425560 -1365000
          )
        )
      )
      (net "N-0000063"
        (wire
          (path B.Cu 2540
            290000 -1539200
            290000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            290000 -1522687
            325560 -1487127
            325560 -1365000
          )
        )
      )
      (net "N-0000065"
        (wire
          (path B.Cu 2540
            2390000 -1539200
            2390000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            2390000 -1522687
            2425560 -1487127
            2425560 -1365000
          )
        )
      )
      (net "N-0000066"
        (wire
          (path B.Cu 2540
            2490000 -1539200
            2490000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            2490000 -1522687
            2525560 -1487127
            2525560 -1365000
          )
        )
      )
      (net "N-0000067"
        (wire
          (path B.Cu 2540
            2590000 -1539200
            2590000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            2590000 -1522687
            2625560 -1487127
            2625560 -1365000
          )
        )
      )
      (net "N-0000068"
        (wire
          (path B.Cu 2540
            2690000 -1539200
            2690000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            2690000 -1522687
            2725560 -1487127
            2725560 -1365000
          )
        )
      )
      (net "N-0000069"
        (wire
          (path F.Cu 2540
            2790000 -1539200
            2790000 -1522687
          )
        )
        (wire
          (path F.Cu 2540
            2790000 -1522687
            2825560 -1487127
            2825560 -1365000
          )
        )
      )
      (net "N-0000070"
        (wire
          (path F.Cu 2540
            2290000 -1539200
            2290000 -1522687
          )
        )
        (wire
          (path F.Cu 2540
            2290000 -1522687
            2325560 -1487127
            2325560 -1365000
          )
        )
      )
      (net "N-0000071"
        (wire
          (path B.Cu 2540
            890000 -1539200
            890000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            890000 -1522687
            925560 -1487127
            925560 -1365000
          )
        )
      )
      (net "N-0000072"
        (wire
          (path B.Cu 2540
            990000 -1539200
            990000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            990000 -1522687
            1025560 -1487127
            1025560 -1365000
          )
        )
      )
      (net "N-0000073"
        (wire
          (path B.Cu 2540
            1090000 -1539200
            1090000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            1090000 -1522687
            1125560 -1487127
            1125560 -1365000
          )
        )
      )
      (net "N-0000074"
        (wire
          (path B.Cu 2540
            1190000 -1539200
            1190000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            1190000 -1522687
            1225560 -1487127
            1225560 -1365000
          )
        )
      )
      (net "N-0000079"
        (wire
          (path B.Cu 2540
            1290000 -1522687
            1325560 -1487127
            1325560 -1375798
          )
        )
        (wire
          (path B.Cu 2540
            1325560 -1365000
            1325560 -1375798
          )
        )
        (wire
          (path B.Cu 2540
            1290000 -1539200
            1290000 -1522687
          )
        )
      )
      (net "N-0000085"
        (wire
          (path B.Cu 2540
            2090000 -1539200
            2090000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            2090000 -1522687
            2125560 -1487127
            2125560 -1365000
          )
        )
      )
      (net "N-0000086"
        (wire
          (path B.Cu 2540
            2190000 -1539200
            2190000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            2190000 -1522687
            2225560 -1487127
            2225560 -1365000
          )
        )
      )
      (net "N-0000087"
        (wire
          (path F.Cu 2540
            1390000 -1539200
            1390000 -1522687
          )
        )
        (wire
          (path F.Cu 2540
            1390000 -1522687
            1425560 -1487127
            1425560 -1365000
          )
        )
      )
      (net "N-0000088"
        (wire
          (path B.Cu 2540
            1490000 -1539200
            1490000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            1490000 -1522687
            1525560 -1487127
            1525560 -1365000
          )
        )
      )
      (net "N-0000089"
        (wire
          (path F.Cu 2540
            1590000 -1539200
            1590000 -1522687
          )
        )
        (wire
          (path F.Cu 2540
            1590000 -1522687
            1625560 -1487127
            1625560 -1365000
          )
        )
      )
      (net "N-0000090"
        (wire
          (path F.Cu 2540
            1690000 -1539200
            1690000 -1522687
          )
        )
        (wire
          (path F.Cu 2540
            1690000 -1522687
            1725560 -1487127
            1725560 -1365000
          )
        )
      )
      (net "N-0000091"
        (wire
          (path B.Cu 2540
            1790000 -1539200
            1790000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            1790000 -1522687
            1825560 -1487127
            1825560 -1365000
          )
        )
      )
      (net "N-0000092"
        (wire
          (path B.Cu 2540
            1890000 -1539200
            1890000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            1890000 -1522687
            1925560 -1487127
            1925560 -1365000
          )
        )
      )
      (net "N-0000093"
        (wire
          (path B.Cu 2540
            1990000 -1539200
            1990000 -1522687
          )
        )
        (wire
          (path B.Cu 2540
            1990000 -1522687
            2025560 -1487127
            2025560 -1365000
          )
        )
      )
      (net RX
        (wire
          (path B.Cu 2540
            668400 -1152000
            671787 -1148613
            732959 -1148613
            767000 -1182654
            767000 -1240000
            779700 -1252700
          )
        )
        (wire
          (path F.Cu 2540
            779700 -1252700
            702400 -1330000
            225600 -1330000
          )
        )
      )
      (net SPARE_IO
        (wire
          (path B.Cu 2540
            449500 -1227300
            463466 -1241266
            479661 -1241266
            487600 -1249205
            487600 -1256169
            548876 -1317445
            718670 -1317445
            721583 -1314532
            848598 -1314532
            857128 -1323062
            926456 -1323062
            982540 -1266978
            1619792 -1266978
            1622826 -1270012
          )
        )
        (wire
          (path F.Cu 2540
            2475500 -1287800
            2457712 -1270012
            1622826 -1270012
          )
        )
        (via "Via[0-1]_889:635_um" 1622826 -1270012
        )
        (wire
          (path F.Cu 2540
            2475500 -1287800
            2475500 -1313200
          )
        )
      )
      (net TX
        (wire
          (path B.Cu 2540
            668400 -1118000
            712498 -1118000
            817006 -1222508
            817006 -1240794
            805100 -1252700
          )
        )
        (wire
          (path F.Cu 2540
            805100 -1252700
            716849 -1340951
            135623 -1340951
            129910 -1335238
            110826 -1335238
            103482 -1342582
            103482 -1386582
            115000 -1398100
          )
        )
      )
      (net col1
        (wire
          (path F.Cu 2540
            902700 -1319828
            897072 -1319828
            851900 -1365000
          )
        )
        (wire
          (path F.Cu 2540
            2051900 -1365000
            2006728 -1319828
            902700 -1319828
          )
        )
        (wire
          (path F.Cu 2540
            902700 -1319828
            902700 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            2051900 -1365000
            2095110 -1365000
            2115968 -1344142
            2469958 -1344142
            2500900 -1313200
          )
        )
        (wire
          (path F.Cu 2540
            902700 -980060
            902700 -852000
          )
        )
        (wire
          (path F.Cu 2540
            902700 -998000
            902700 -980060
          )
        )
        (wire
          (path F.Cu 2540
            902700 -980060
            387240 -980060
            376000 -991300
          )
        )
        (wire
          (path B.Cu 2540
            2402700 -766805
            2397650 -766805
            2390505 -773950
            2390505 -807429
            2424985 -841909
            2424985 -910277
            2500900 -986192
            2500900 -1287800
          )
        )
        (wire
          (path B.Cu 2540
            2602700 -998000
            2590197 -1010503
            2572282 -1010503
            2450476 -888697
            2450476 -809530
            2407751 -766805
            2402700 -766805
          )
        )
        (wire
          (path B.Cu 2540
            2402700 -766805
            2402700 -706000
          )
        )
        (wire
          (path B.Cu 2540
            2500900 -1313200
            2500900 -1287800
          )
        )
        (wire
          (path B.Cu 2540
            902700 -852000
            897645 -846945
            897645 -711055
            902700 -706000
          )
        )
        (wire
          (path B.Cu 2540
            902700 -1144000
            902700 -998000
          )
        )
        (wire
          (path B.Cu 2540
            376000 -991300
            251900 -1115400
            251900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            302700 -706000
            302700 -918000
            376000 -991300
          )
        )
        (wire
          (path B.Cu 2540
            902700 -1290000
            897475 -1284775
            897475 -1149225
            902700 -1144000
          )
        )
      )
      (net col10
        (wire
          (path B.Cu 2540
            2602700 -779000
            2564706 -816994
            2564706 -934782
            2729500 -1099576
            2729500 -1287800
          )
        )
        (wire
          (path F.Cu 2540
            1802700 -706000
            1820450 -723750
            2119706 -723750
            2149900 -693556
            2583066 -693556
            2590000 -700490
            2590000 -766300
            2602700 -779000
          )
        )
        (wire
          (path B.Cu 2540
            1802700 -998000
            1802700 -1061727
            1707700 -1156727
            1701121 -1156727
            1690327 -1167521
            1690327 -1167769
            1621397 -1236699
            979385 -1236699
            913517 -1302567
            872621 -1302567
            860054 -1290000
            844466 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            844466 -1290000
            702700 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            844466 -1290000
            844466 -1247966
            852432 -1240000
            860267 -1240000
            867466 -1232801
            867466 -1190925
            684168 -1007627
            620927 -1007627
            604600 -991300
          )
        )
        (wire
          (path B.Cu 2540
            1802700 -852000
            1802700 -998000
          )
        )
        (wire
          (path B.Cu 2540
            2729500 -1313200
            2729500 -1287800
          )
        )
        (wire
          (path B.Cu 2540
            1802700 -1290000
            1802700 -1314200
            1751900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            1802700 -1144000
            1802700 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            1802700 -998000
            1802700 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            1802700 -706000
            1802700 -852000
          )
        )
      )
      (net col11
        (wire
          (path B.Cu 2540
            2754900 -1287800
            2754900 -1096506
            2590000 -931606
            2590000 -864700
            2602700 -852000
          )
        )
        (wire
          (path B.Cu 2540
            2754900 -1313200
            2754900 -1287800
          )
        )
        (wire
          (path F.Cu 2540
            2602700 -852000
            2615335 -864635
            2615335 -929633
            2607730 -937238
            2502897 -937238
            2440222 -874563
            1925263 -874563
            1902700 -852000
          )
        )
        (wire
          (path B.Cu 2540
            1902700 -852000
            1902700 -998000
          )
        )
        (wire
          (path B.Cu 2540
            1902700 -706000
            1902700 -852000
          )
        )
        (wire
          (path F.Cu 2540
            1902700 -998000
            1902700 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            1902700 -706000
            1884949 -688249
            877805 -688249
            683427 -882627
            683427 -978664
            659879 -1002212
            640912 -1002212
            630000 -991300
          )
        )
        (wire
          (path B.Cu 2540
            1902700 -1290000
            1902700 -1314200
            1851900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            1902700 -1144000
            1902700 -1290000
          )
        )
      )
      (net col12
        (wire
          (path F.Cu 2540
            2002700 -1144000
            2002700 -1130259
            2030340 -1102619
          )
        )
        (wire
          (path B.Cu 2540
            2002700 -998000
            2002700 -1074979
            2030340 -1102619
          )
        )
        (wire
          (path B.Cu 2540
            1994465 -839286
            1972445 -839286
            1965105 -846626
            1965105 -960405
            2002700 -998000
          )
        )
        (via "Via[0-1]_889:635_um" 2030340 -1102619
        )
        (wire
          (path B.Cu 2540
            1994465 -839286
            1994465 -843765
            2002700 -852000
          )
        )
        (wire
          (path B.Cu 2540
            1994465 -718196
            1994465 -839286
          )
        )
        (wire
          (path B.Cu 2540
            1994465 -718196
            2002700 -709961
            2002700 -706000
          )
        )
        (wire
          (path B.Cu 2540
            655400 -991300
            655400 -902970
            875205 -683165
            1903320 -683165
            1938351 -718196
            1994465 -718196
          )
        )
        (wire
          (path B.Cu 2540
            2780300 -1287800
            2780300 -1102600
            2602700 -925000
          )
        )
        (wire
          (path B.Cu 2540
            2780300 -1313200
            2780300 -1287800
          )
        )
        (wire
          (path F.Cu 2540
            2602700 -925000
            2547039 -869339
            2020039 -869339
            2002700 -852000
          )
        )
        (wire
          (path B.Cu 2540
            1970417 -1302410
            1970417 -1346483
            1951900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            2002700 -1144000
            1965005 -1181695
            1965005 -1296998
            1970417 -1302410
          )
        )
        (wire
          (path B.Cu 2540
            1970417 -1302410
            1990290 -1302410
            2002700 -1290000
          )
        )
      )
      (net col1a
        (wire
          (path B.Cu 2540
            855900 -1227300
            832312 -1203712
            811814 -1203712
            714668 -1106566
            637609 -1106566
            629033 -1115142
            629033 -1118000
          )
        )
        (wire
          (path B.Cu 2540
            617600 -1118000
            629033 -1118000
          )
        )
      )
      (net col2
        (wire
          (path F.Cu 2540
            2151900 -1365000
            2140935 -1375965
            1985324 -1375965
            1953253 -1343894
            973006 -1343894
            951900 -1365000
          )
        )
        (wire
          (path F.Cu 2540
            2526300 -1313200
            2487734 -1351766
            2165134 -1351766
            2151900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            2572572 -1058449
            2590149 -1058449
            2602700 -1071000
          )
        )
        (wire
          (path B.Cu 2540
            2526300 -1287800
            2526300 -1104721
            2572572 -1058449
          )
        )
        (wire
          (path B.Cu 2540
            2572572 -1058449
            2572572 -1017981
            2445392 -890801
            2445392 -821692
            2402700 -779000
          )
        )
        (wire
          (path B.Cu 2540
            401400 -991300
            264733 -1127967
            264733 -1294831
            291142 -1321240
            308140 -1321240
            351900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            402700 -706000
            402700 -990000
            401400 -991300
          )
        )
        (wire
          (path F.Cu 2540
            1002700 -1290000
            1002700 -1228440
          )
        )
        (wire
          (path B.Cu 2540
            1002700 -1228440
            1002700 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            1002700 -1144000
            1002700 -998000
          )
        )
        (via "Via[0-1]_889:635_um" 1002700 -1228440
        )
        (wire
          (path F.Cu 2540
            1002700 -706000
            990172 -693472
            654471 -693472
            629540 -718403
            415103 -718403
            402700 -706000
          )
        )
        (wire
          (path F.Cu 2540
            1002700 -998000
            1002700 -852000
          )
        )
        (wire
          (path B.Cu 2540
            2526300 -1313200
            2526300 -1287800
          )
        )
        (wire
          (path B.Cu 2540
            1002700 -1290000
            1002700 -1314200
            951900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            1002700 -852000
            1002700 -706000
          )
        )
      )
      (net col2a
        (wire
          (path F.Cu 2540
            617600 -1152000
            629033 -1152000
          )
        )
        (wire
          (path F.Cu 2540
            629033 -1152000
            629033 -1154858
            680123 -1205948
            809148 -1205948
            830500 -1227300
          )
        )
      )
      (net col3
        (wire
          (path B.Cu 2540
            426800 -991300
            422334 -991300
            290000 -1123634
            290000 -1295160
            338877 -1344037
            430937 -1344037
            451900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            502700 -706000
            426800 -781900
            426800 -991300
          )
        )
        (wire
          (path F.Cu 2540
            2251900 -1365000
            2235851 -1381049
            1983220 -1381049
            1951149 -1348978
            1067922 -1348978
            1051900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            2488200 -1316770
            2488200 -985930
            2402700 -900430
            2402700 -852000
          )
        )
        (wire
          (path B.Cu 2540
            2551700 -1313200
            2539781 -1325119
            2496549 -1325119
            2488200 -1316770
          )
        )
        (wire
          (path B.Cu 2540
            2488200 -1316770
            2468371 -1336599
            2280301 -1336599
            2251900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            2551700 -1287800
            2551700 -1313200
          )
        )
        (wire
          (path F.Cu 2540
            1102700 -1290000
            1102700 -1228440
          )
        )
        (wire
          (path B.Cu 2540
            1102700 -1144000
            1102700 -1228440
          )
        )
        (wire
          (path B.Cu 2540
            1102700 -998000
            1102700 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            1102700 -852000
            1102700 -998000
          )
        )
        (wire
          (path F.Cu 2540
            1102700 -706000
            1080006 -683306
            525394 -683306
            502700 -706000
          )
        )
        (wire
          (path F.Cu 2540
            2402700 -852000
            2414956 -864256
            2582306 -864256
            2590000 -856562
            2590000 -847385
            2708089 -729296
            2779404 -729296
            2802700 -706000
          )
        )
        (wire
          (path B.Cu 2540
            1102700 -706000
            1102700 -852000
          )
        )
        (via "Via[0-1]_889:635_um" 1102700 -1228440
        )
        (wire
          (path B.Cu 2540
            1102700 -1290000
            1102700 -1314200
            1051900 -1365000
          )
        )
      )
      (net col4
        (wire
          (path F.Cu 2540
            1151900 -1365000
            1141101 -1375799
            798427 -1375799
            776829 -1354201
            562699 -1354201
            551900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            2577100 -1287800
            2577100 -1313200
          )
        )
        (wire
          (path B.Cu 2540
            2602700 -1144000
            2590000 -1156700
            2590000 -1274900
            2577100 -1287800
          )
        )
        (wire
          (path F.Cu 2540
            2584450 -1106750
            2602700 -1125000
            2602700 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            2402700 -925000
            2584450 -1106750
          )
        )
        (wire
          (path F.Cu 2540
            2584450 -1106750
            2790000 -901200
            2790000 -791700
            2802700 -779000
          )
        )
        (wire
          (path F.Cu 2540
            1202700 -852000
            1246336 -895636
            2373336 -895636
            2402700 -925000
          )
        )
        (wire
          (path B.Cu 2540
            452200 -991300
            452200 -856500
            602700 -706000
          )
        )
        (wire
          (path F.Cu 2540
            1202700 -1290000
            1202700 -1228440
          )
        )
        (wire
          (path B.Cu 2540
            1202700 -1144000
            1202700 -1228440
          )
        )
        (wire
          (path B.Cu 2540
            1202700 -1290000
            1202700 -1314200
            1151900 -1365000
          )
        )
        (wire
          (path F.Cu 2540
            1202700 -706000
            1190492 -718208
            1038889 -718208
            1009070 -688389
            620311 -688389
            602700 -706000
          )
        )
        (wire
          (path B.Cu 2540
            2351900 -1365000
            2374911 -1341989
            2548311 -1341989
            2577100 -1313200
          )
        )
        (wire
          (path B.Cu 2540
            1202700 -998000
            1202700 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            1202700 -852000
            1202700 -998000
          )
        )
        (wire
          (path B.Cu 2540
            1202700 -706000
            1202700 -852000
          )
        )
        (via "Via[0-1]_889:635_um" 1202700 -1228440
        )
      )
      (net col5
        (wire
          (path F.Cu 2540
            1302700 -998000
            1352674 -948026
            2352726 -948026
            2402700 -998000
          )
        )
        (wire
          (path F.Cu 2540
            2584412 -1179711
            2402700 -998000
          )
        )
        (wire
          (path F.Cu 2540
            1285409 -723291
            1302700 -706000
          )
        )
        (wire
          (path F.Cu 2540
            702700 -706000
            714958 -718258
            914410 -718258
            915172 -717496
            964914 -717496
            970709 -723291
            1285409 -723291
          )
        )
        (wire
          (path F.Cu 2540
            1302700 -852000
            1302700 -740582
            1285409 -723291
          )
        )
        (wire
          (path F.Cu 2540
            2602700 -1217000
            2602700 -1198000
            2584412 -1179711
          )
        )
        (wire
          (path F.Cu 2540
            2802700 -852000
            2802700 -961423
            2584412 -1179711
          )
        )
        (wire
          (path B.Cu 2540
            702700 -706000
            702700 -766200
            477600 -991300
          )
        )
        (wire
          (path B.Cu 2540
            2602500 -1287800
            2602500 -1313200
          )
        )
        (wire
          (path B.Cu 2540
            2602700 -1217000
            2602500 -1217200
            2602500 -1287800
          )
        )
        (wire
          (path F.Cu 2540
            1251900 -1365000
            1230860 -1386040
            672940 -1386040
            651900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            1302700 -1290000
            1302700 -1314200
            1251900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            1302700 -1144000
            1302700 -1224954
            1299214 -1228440
          )
        )
        (wire
          (path F.Cu 2540
            1302700 -1290000
            1299214 -1286514
            1299214 -1228440
          )
        )
        (wire
          (path B.Cu 2540
            2451900 -1365000
            2466850 -1350050
            2565650 -1350050
            2602500 -1313200
          )
        )
        (via "Via[0-1]_889:635_um" 1299214 -1228440
        )
        (wire
          (path B.Cu 2540
            1302700 -998000
            1302700 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            1302700 -852000
            1302700 -998000
          )
        )
      )
      (net col6
        (wire
          (path F.Cu 2540
            1402700 -998000
            1420560 -1015860
            1612551 -1015860
            1653282 -975129
            2125019 -975129
            2148688 -998798
            2235908 -998798
            2287164 -1050054
            2381754 -1050054
            2402700 -1071000
          )
        )
        (wire
          (path B.Cu 2540
            503000 -991300
            765293 -729007
            779693 -729007
            802700 -706000
          )
        )
        (wire
          (path B.Cu 2540
            311683 -1290000
            311683 -1109141
            400177 -1020647
            473653 -1020647
            503000 -991300
          )
        )
        (wire
          (path F.Cu 2540
            1402700 -1228050
            1402700 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            1402700 -1144000
            1402700 -1228050
          )
        )
        (wire
          (path B.Cu 2540
            751900 -1365000
            725853 -1338953
            360636 -1338953
            311683 -1290000
          )
        )
        (via "Via[0-1]_889:635_um" 1402700 -1228050
        )
        (wire
          (path B.Cu 2540
            1402700 -998000
            1402700 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            1402700 -1290000
            1402700 -1314200
            1351900 -1365000
          )
        )
        (wire
          (path F.Cu 2540
            2627900 -1287800
            2411100 -1071000
            2402700 -1071000
          )
        )
        (wire
          (path F.Cu 2540
            1351900 -1365000
            1341101 -1354201
            1194682 -1354201
            1167935 -1380948
            767848 -1380948
            751900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            311683 -1290000
            302700 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            1402700 -998000
            1402700 -852000
          )
        )
        (wire
          (path B.Cu 2540
            1402700 -706000
            1402700 -852000
          )
        )
        (wire
          (path B.Cu 2540
            2627900 -1313200
            2576100 -1365000
            2551900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            2627900 -1287800
            2627900 -1313200
          )
        )
      )
      (net col7
        (wire
          (path B.Cu 2540
            802700 -1144000
            790503 -1156197
            771780 -1156197
            646395 -1030812
            567912 -1030812
            528400 -991300
          )
        )
        (wire
          (path B.Cu 2540
            528400 -991300
            484585 -1035115
            418307 -1035115
            387266 -1066156
            387266 -1274566
            402700 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            1502700 -1290000
            1502700 -1314200
            1451900 -1365000
          )
        )
        (wire
          (path F.Cu 2540
            1580419 -1215844
            2330856 -1215844
            2402700 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            1502700 -1290000
            1576856 -1215844
            1580419 -1215844
          )
        )
        (wire
          (path F.Cu 2540
            2641571 -1299529
            2641571 -1301471
            2653300 -1313200
          )
        )
        (wire
          (path F.Cu 2540
            2653300 -1287800
            2641571 -1299529
          )
        )
        (wire
          (path F.Cu 2540
            2641571 -1299529
            2623462 -1299529
            2615200 -1291267
            2615200 -1284253
            2474947 -1144000
            2402700 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            1502700 -1144000
            1508575 -1144000
            1580419 -1215844
          )
        )
        (wire
          (path B.Cu 2540
            1502700 -998000
            1502700 -1144000
          )
        )
        (via "Via[0-1]_889:635_um" 1580419 -1215844
        )
        (wire
          (path B.Cu 2540
            1502700 -852000
            1502700 -998000
          )
        )
        (wire
          (path F.Cu 2540
            1502700 -1144000
            1490412 -1156288
            814988 -1156288
            802700 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            2653300 -1313200
            2653300 -1363600
            2651900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            1502700 -852000
            1502700 -706000
          )
        )
      )
      (net col8
        (wire
          (path B.Cu 2540
            1602700 -852000
            1602700 -706000
          )
        )
        (wire
          (path B.Cu 2540
            1602700 -1010468
            1572441 -1010468
            1564896 -1002923
            1564896 -889804
            1602700 -852000
          )
        )
        (wire
          (path B.Cu 2540
            553800 -991300
            542967 -980467
            523962 -980467
            517499 -986930
            517499 -992073
            483842 -1025730
            402357 -1025730
            317164 -1110923
            317164 -1253492
            344426 -1280754
          )
        )
        (wire
          (path B.Cu 2540
            1622028 -1224390
            1602700 -1205062
            1602700 -1144000
          )
        )
        (via "Via[0-1]_889:635_um" 1622028 -1224390
        )
        (wire
          (path F.Cu 2540
            1630305 -1232667
            1602700 -1260272
            1602700 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            2402700 -1217000
            2387033 -1232667
            1630305 -1232667
          )
        )
        (wire
          (path F.Cu 2540
            1630305 -1232667
            1622028 -1224390
          )
        )
        (wire
          (path B.Cu 2540
            1602700 -1010468
            1602700 -998000
          )
        )
        (wire
          (path B.Cu 2540
            1602700 -1144000
            1602700 -1010468
          )
        )
        (wire
          (path B.Cu 2540
            502700 -1290000
            535228 -1322528
            720775 -1322528
            723687 -1319616
            833665 -1319616
            864229 -1350180
            930720 -1350180
            936932 -1356392
            936932 -1365769
            947424 -1376261
            980985 -1376261
            1047575 -1309671
            1074969 -1309671
            1090000 -1294640
            1090000 -1285169
            1103090 -1272079
            1584779 -1272079
            1602700 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            502700 -1290000
            490476 -1302224
            450282 -1302224
            425862 -1277804
            347376 -1277804
            344426 -1280754
          )
        )
        (wire
          (path B.Cu 2540
            1602700 -1290000
            1602700 -1314200
            1551900 -1365000
          )
        )
        (via "Via[0-1]_889:635_um" 344426 -1280754
        )
        (wire
          (path F.Cu 2540
            2678700 -1313200
            2667097 -1324803
            2623000 -1324803
            2613934 -1315737
            2613934 -1308466
            2604702 -1299234
            2597766 -1299234
            2589800 -1291268
            2589800 -1284209
            2570520 -1264929
            2450628 -1264929
            2450628 -1264928
            2402700 -1217000
          )
        )
        (wire
          (path F.Cu 2540
            2678700 -1287800
            2678700 -1313200
          )
        )
        (wire
          (path B.Cu 2540
            2678700 -1313200
            2716105 -1350605
            2737505 -1350605
            2751900 -1365000
          )
        )
      )
      (net col9
        (wire
          (path F.Cu 2540
            567816 -1093605
            567816 -1002684
            579200 -991300
          )
        )
        (wire
          (path B.Cu 2540
            613856 -1290000
            613856 -1223086
            567816 -1177046
            567816 -1093605
          )
        )
        (wire
          (path F.Cu 2540
            2602700 -706000
            2585172 -688472
            2125676 -688472
            2109943 -704205
            2066267 -704205
            2055364 -693302
            1715398 -693302
            1702700 -706000
          )
        )
        (wire
          (path B.Cu 2540
            613856 -1290000
            602700 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            1693295 -1261413
            977441 -1261413
            920876 -1317978
            859234 -1317978
            850612 -1309356
            719571 -1309356
            716565 -1312362
            636218 -1312362
            613856 -1290000
          )
        )
        (via "Via[0-1]_889:635_um" 567816 -1093605
        )
        (wire
          (path B.Cu 2540
            2704100 -1287800
            2704100 -1081367
            2559498 -936765
            2559498 -749202
            2602700 -706000
          )
        )
        (wire
          (path B.Cu 2540
            2704100 -1313200
            2704100 -1287800
          )
        )
        (wire
          (path B.Cu 2540
            1702700 -1290000
            1693295 -1280595
            1693295 -1261413
          )
        )
        (wire
          (path B.Cu 2540
            1708751 -1175151
            1693295 -1190607
            1693295 -1261413
          )
        )
        (via "Via[0-1]_889:635_um" 1708751 -1175151
        )
        (wire
          (path F.Cu 2540
            1702700 -1144000
            1708751 -1150051
            1708751 -1175151
          )
        )
        (wire
          (path B.Cu 2540
            1702700 -1290000
            1702700 -1314200
            1651900 -1365000
          )
        )
        (wire
          (path B.Cu 2540
            1702700 -852000
            1702700 -998000
          )
        )
        (wire
          (path B.Cu 2540
            1702700 -706000
            1702700 -852000
          )
        )
        (wire
          (path B.Cu 2540
            1702700 -1144000
            1702700 -998000
          )
        )
      )
      (net led1
        (wire
          (path B.Cu 2540
            1977300 -706000
            1989496 -693804
            2008244 -693804
            2146246 -831806
            2146246 -866766
            2225680 -946200
            2231880 -946200
            2244891 -959211
            2244891 -1095009
            2228600 -1111300
          )
        )
        (wire
          (path B.Cu 2540
            1777300 -706000
            1789699 -693601
            1864901 -693601
            1877300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            1777300 -706000
            1765105 -693805
            1689495 -693805
            1677300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            1677300 -706000
            1665105 -693805
            1589495 -693805
            1577300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            1577300 -706000
            1565105 -693805
            1489495 -693805
            1477300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            1477300 -706000
            1465105 -693805
            1389495 -693805
            1377300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            1377300 -706000
            1365105 -693805
            1289495 -693805
            1277300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            1277300 -706000
            1265105 -693805
            1189495 -693805
            1177300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            1177300 -706000
            1165105 -693805
            1089495 -693805
            1077300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            1077300 -706000
            1065105 -693805
            989495 -693805
            977300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            977300 -706000
            965105 -693805
            889495 -693805
            877300 -706000
          )
        )
        (wire
          (path F.Cu 2540
            1977300 -706000
            1964948 -718352
            1889652 -718352
            1877300 -706000
          )
        )
      )
      (net led2
        (wire
          (path F.Cu 2540
            1277300 -852000
            1289496 -864196
            1365104 -864196
            1377300 -852000
          )
        )
        (wire
          (path F.Cu 2540
            1177300 -852000
            1189496 -839804
            1265104 -839804
            1277300 -852000
          )
        )
        (wire
          (path F.Cu 2540
            1977300 -852000
            1964713 -839413
            1889887 -839413
            1877300 -852000
          )
        )
        (wire
          (path F.Cu 2540
            1877300 -852000
            1865104 -839804
            1789496 -839804
            1777300 -852000
          )
        )
        (wire
          (path F.Cu 2540
            1777300 -852000
            1764657 -864643
            1689943 -864643
            1677300 -852000
          )
        )
        (wire
          (path F.Cu 2540
            1677300 -852000
            1665104 -839804
            1589496 -839804
            1577300 -852000
          )
        )
        (wire
          (path F.Cu 2540
            1577300 -852000
            1564657 -864643
            1489943 -864643
            1477300 -852000
          )
        )
        (wire
          (path F.Cu 2540
            1477300 -852000
            1465104 -839804
            1389496 -839804
            1377300 -852000
          )
        )
        (wire
          (path B.Cu 2540
            1977300 -852000
            2020025 -894725
            2154577 -894725
            2213999 -954147
            2213999 -1071299
            2228600 -1085900
          )
        )
        (wire
          (path F.Cu 2540
            1177300 -852000
            1164995 -864305
            1089605 -864305
            1077300 -852000
          )
        )
        (wire
          (path B.Cu 2540
            1077300 -852000
            1065104 -864196
            989496 -864196
            977300 -852000
          )
        )
        (wire
          (path B.Cu 2540
            877300 -852000
            889496 -864196
            965104 -864196
            977300 -852000
          )
        )
      )
      (net led3
        (wire
          (path F.Cu 2540
            1577300 -998000
            1564659 -985359
            1489941 -985359
            1477300 -998000
          )
        )
        (wire
          (path F.Cu 2540
            1477300 -998000
            1460021 -980721
            1394579 -980721
            1377300 -998000
          )
        )
        (wire
          (path B.Cu 2540
            1577300 -998000
            1589569 -985731
            1665031 -985731
            1677300 -998000
          )
        )
        (wire
          (path F.Cu 2540
            1177300 -998000
            1189496 -1010196
            1265104 -1010196
            1277300 -998000
          )
        )
        (wire
          (path F.Cu 2540
            1177300 -998000
            1165097 -1010203
            1089503 -1010203
            1077300 -998000
          )
        )
        (wire
          (path F.Cu 2540
            1377300 -998000
            1365104 -1010196
            1289496 -1010196
            1277300 -998000
          )
        )
        (wire
          (path F.Cu 2540
            1777300 -998000
            1789851 -985449
            1864749 -985449
            1877300 -998000
          )
        )
        (wire
          (path F.Cu 2540
            1677300 -998000
            1689496 -1010196
            1765104 -1010196
            1777300 -998000
          )
        )
        (wire
          (path F.Cu 2540
            977300 -998000
            965010 -1010290
            889590 -1010290
            877300 -998000
          )
        )
        (wire
          (path F.Cu 2540
            1977300 -998000
            2001700 -1022400
            2231272 -1022400
            2239433 -1030561
            2239433 -1049667
            2228600 -1060500
          )
        )
        (wire
          (path F.Cu 2540
            1877300 -998000
            1889730 -985570
            1964870 -985570
            1977300 -998000
          )
        )
        (wire
          (path B.Cu 2540
            1077300 -998000
            1064765 -985465
            989835 -985465
            977300 -998000
          )
        )
      )
      (net led4
        (wire
          (path F.Cu 2540
            1977300 -1144000
            1977300 -1143582
            2047067 -1073815
            2189886 -1073815
            2189886 -1073814
            2228600 -1035100
          )
        )
        (wire
          (path F.Cu 2540
            1377300 -1144000
            1365104 -1131804
            1289496 -1131804
            1277300 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            1477300 -1144000
            1465104 -1131804
            1389496 -1131804
            1377300 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            977300 -1144000
            965104 -1131804
            889496 -1131804
            877300 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            1077300 -1144000
            1065104 -1131804
            989496 -1131804
            977300 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            1777300 -1144000
            1765036 -1131736
            1689564 -1131736
            1677300 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            1177300 -1144000
            1165104 -1131804
            1089496 -1131804
            1077300 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            1277300 -1144000
            1265104 -1131804
            1189496 -1131804
            1177300 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            1877300 -1144000
            1889677 -1131623
            1964923 -1131623
            1977300 -1144000
          )
        )
        (wire
          (path B.Cu 2540
            1877300 -1144000
            1864883 -1131583
            1789717 -1131583
            1777300 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            1677300 -1144000
            1665078 -1156222
            1589522 -1156222
            1577300 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            1577300 -1144000
            1565104 -1131804
            1489496 -1131804
            1477300 -1144000
          )
        )
      )
      (net led5
        (wire
          (path F.Cu 2540
            2117167 -1175345
            2219312 -1073200
            2231781 -1073200
            2245007 -1059974
            2245007 -1026107
            2228600 -1009700
          )
        )
        (via "Via[0-1]_889:635_um" 2117167 -1175345
        )
        (wire
          (path B.Cu 2540
            1977300 -1290000
            2091955 -1175345
            2117167 -1175345
          )
        )
        (wire
          (path F.Cu 2540
            1277300 -1290000
            1265104 -1302196
            1189496 -1302196
            1177300 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            1077300 -1290000
            1089496 -1302196
            1165104 -1302196
            1177300 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            1977300 -1290000
            1964997 -1302303
            1889603 -1302303
            1877300 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            977300 -1290000
            965104 -1277804
            889496 -1277804
            877300 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            1077300 -1290000
            1064887 -1277587
            989713 -1277587
            977300 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            1377300 -1290000
            1364881 -1277581
            1289719 -1277581
            1277300 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            1477300 -1290000
            1489495 -1277805
            1565105 -1277805
            1577300 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            1777300 -1290000
            1765104 -1302196
            1689496 -1302196
            1677300 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            1577300 -1290000
            1589496 -1302196
            1665104 -1302196
            1677300 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            1877300 -1290000
            1865105 -1277805
            1789495 -1277805
            1777300 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            1477300 -1290000
            1465105 -1277805
            1389495 -1277805
            1377300 -1290000
          )
        )
      )
      (net led6
        (wire
          (path F.Cu 2540
            2377300 -998000
            2242300 -998000
            2228600 -984300
          )
        )
        (wire
          (path F.Cu 2540
            2389551 -718251
            2565049 -718251
          )
        )
        (wire
          (path F.Cu 2540
            2377300 -706000
            2389551 -718251
          )
        )
        (wire
          (path F.Cu 2540
            2377300 -779000
            2377300 -730502
            2389551 -718251
          )
        )
        (wire
          (path F.Cu 2540
            2565049 -718251
            2577300 -706000
          )
        )
        (wire
          (path F.Cu 2540
            2565049 -718251
            2565049 -766749
            2577300 -779000
          )
        )
        (wire
          (path B.Cu 2540
            2377300 -1144000
            2377300 -1217000
          )
        )
        (wire
          (path B.Cu 2540
            2377300 -1071000
            2377300 -1144000
          )
        )
        (wire
          (path F.Cu 2540
            2577300 -779000
            2577300 -852000
          )
        )
        (wire
          (path B.Cu 2540
            2577300 -852000
            2577300 -925000
          )
        )
        (wire
          (path B.Cu 2540
            2377300 -998000
            2377300 -1071000
          )
        )
        (wire
          (path B.Cu 2540
            2377300 -925000
            2377300 -998000
          )
        )
        (wire
          (path B.Cu 2540
            2377300 -852000
            2377300 -925000
          )
        )
        (wire
          (path B.Cu 2540
            2377300 -779000
            2377300 -852000
          )
        )
      )
      (net led7
        (wire
          (path F.Cu 2540
            2228600 -958900
            2355540 -958900
            2390000 -993360
            2390000 -1029700
            2577300 -1217000
          )
        )
        (wire
          (path B.Cu 2540
            2577300 -1144000
            2577300 -1217000
          )
        )
        (wire
          (path F.Cu 2540
            2777300 -852000
            2723300 -852000
            2577300 -998000
          )
        )
        (wire
          (path F.Cu 2540
            2777300 -779000
            2777300 -852000
          )
        )
        (wire
          (path B.Cu 2540
            2777300 -706000
            2777300 -779000
          )
        )
        (wire
          (path F.Cu 2540
            2577300 -1071000
            2577300 -998000
          )
        )
        (wire
          (path B.Cu 2540
            2228600 -958900
            2239609 -969909
            2239609 -1090211
            2231220 -1098600
            2225885 -1098600
            2217524 -1106961
            2217524 -1131008
            2238917 -1152401
            2238917 -1181052
          )
        )
        (wire
          (path B.Cu 2540
            2238917 -1181052
            2199421 -1181052
            2144442 -1126073
            1771310 -1126073
            1730490 -1166893
            1705331 -1166893
            1700493 -1171731
            1700493 -1171979
            1616142 -1256330
            975183 -1256330
            918681 -1312832
            861276 -1312832
            852546 -1304102
            717637 -1304102
            714460 -1307279
            694579 -1307279
            677300 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            477300 -1290000
            464551 -1302749
            390049 -1302749
            377300 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            577300 -1290000
            565003 -1277703
            489597 -1277703
            477300 -1290000
          )
        )
        (wire
          (path F.Cu 2540
            677300 -1290000
            665104 -1277804
            589496 -1277804
            577300 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            2399300 -1313200
            2387380 -1325120
            2368960 -1325120
            2361200 -1317360
            2361200 -1283347
            2258905 -1181052
            2238917 -1181052
          )
        )
        (wire
          (path F.Cu 2540
            377300 -1290000
            365104 -1302196
            289496 -1302196
            277300 -1290000
          )
        )
        (wire
          (path B.Cu 2540
            2399300 -1287800
            2399300 -1313200
          )
        )
        (wire
          (path B.Cu 2540
            2577300 -1144000
            2577300 -1071000
          )
        )
      )
      (net led8
        (wire
          (path B.Cu 2540
            2217649 -897061
            2217649 -922549
            2228600 -933500
          )
        )
        (wire
          (path B.Cu 2540
            815189 -694080
            831332 -677937
            1999705 -677937
            2217649 -895881
            2217649 -897061
          )
        )
        (wire
          (path B.Cu 2540
            2424700 -1287800
            2365104 -1228204
            2365104 -1028730
            2233435 -897061
            2217649 -897061
          )
        )
        (wire
          (path B.Cu 2540
            2424700 -1313200
            2424700 -1287800
          )
        )
        (wire
          (path B.Cu 2540
            815189 -694080
            814894 -693785
            789515 -693785
            777300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            777300 -1144000
            656489 -1023189
            620804 -1023189
            593711 -996096
            593711 -944853
            815189 -723375
            815189 -694080
          )
        )
        (wire
          (path B.Cu 2540
            477300 -706000
            464624 -693324
            389976 -693324
            377300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            577300 -706000
            564624 -693324
            489976 -693324
            477300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            377300 -706000
            364624 -693324
            289976 -693324
            277300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            777300 -706000
            765104 -693804
            689496 -693804
            677300 -706000
          )
        )
        (wire
          (path B.Cu 2540
            577300 -706000
            589496 -693804
            665104 -693804
            677300 -706000
          )
        )
      )
      (net row1
        (wire
          (path B.Cu 3810
            890000 -1595000
            890000 -1577852
          )
        )
        (wire
          (path B.Cu 3810
            890000 -1577852
            836994 -1524846
            836994 -1340694
            827100 -1330800
          )
        )
        (wire
          (path F.Cu 3810
            1590000 -1595000
            1690000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            1490000 -1595000
            1590000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            1890000 -1595000
            1990000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            1790000 -1595000
            1890000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            1690000 -1595000
            1790000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            1390000 -1595000
            1490000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            1290000 -1595000
            1390000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            1190000 -1595000
            1290000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            990000 -1595000
            890000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            1090000 -1595000
            990000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            1190000 -1595000
            1090000 -1595000
          )
        )
      )
      (net row2
        (wire
          (path B.Cu 3810
            690000 -1595000
            719848 -1595000
          )
        )
        (wire
          (path B.Cu 3810
            790000 -1603574
            728422 -1603574
            719848 -1595000
          )
        )
        (wire
          (path B.Cu 3810
            790000 -1603574
            790000 -1612148
          )
        )
        (wire
          (path B.Cu 3810
            790000 -1595000
            790000 -1603574
          )
        )
        (wire
          (path B.Cu 3810
            590000 -1595000
            490000 -1595000
          )
        )
        (wire
          (path B.Cu 3810
            2450100 -1313200
            2432420 -1330880
            2250709 -1330880
            2239137 -1319308
            2139587 -1319308
            2114032 -1344863
            2025437 -1344863
            1940000 -1430300
            1940000 -1526807
            1910458 -1556349
            1490818 -1556349
            1435019 -1612148
            790000 -1612148
          )
        )
        (wire
          (path B.Cu 3810
            2450100 -1287800
            2450100 -1313200
          )
        )
        (wire
          (path B.Cu 3810
            290000 -1595000
            290000 -1577852
          )
        )
        (wire
          (path B.Cu 3810
            290000 -1577852
            245925 -1533777
            245925 -1409381
            192122 -1355578
            192122 -1337722
            149400 -1295000
          )
        )
        (wire
          (path F.Cu 3810
            290000 -1595000
            390000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            590000 -1595000
            690000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            390000 -1595000
            490000 -1595000
          )
        )
      )
      (net row3
        (wire
          (path F.Cu 3810
            2490000 -1595000
            2590000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            2390000 -1595000
            2490000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            2690000 -1595000
            2790000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            2590000 -1595000
            2690000 -1595000
          )
        )
        (wire
          (path F.Cu 3810
            2290000 -1595000
            2390000 -1595000
          )
        )
        (wire
          (path B.Cu 3810
            2239196 -1528656
            2190000 -1577852
          )
        )
        (wire
          (path B.Cu 3810
            2224100 -1330800
            2239196 -1345896
            2239196 -1528656
          )
        )
        (wire
          (path B.Cu 3810
            2290000 -1577852
            2240804 -1528656
            2239196 -1528656
          )
        )
        (wire
          (path B.Cu 3810
            2190000 -1595000
            2190000 -1577852
          )
        )
        (wire
          (path B.Cu 3810
            2290000 -1595000
            2290000 -1577852
          )
        )
        (wire
          (path F.Cu 3810
            2190000 -1595000
            2090000 -1595000
          )
        )
      )
      (net xled1
        (wire
          (path F.Cu 2540
            467355 -1171664
            498489 -1140530
            673533 -1140530
            707115 -1174112
            707115 -1176695
            731045 -1200625
            750777 -1200625
            756860 -1194542
            1632898 -1194542
            1637895 -1199539
            2053363 -1199539
            2141602 -1111300
          )
        )
        (wire
          (path B.Cu 2540
            467355 -1171664
            436800 -1202219
            436800 -1240000
            424100 -1252700
          )
        )
        (wire
          (path F.Cu 2540
            2152400 -1111300
            2141602 -1111300
          )
        )
        (via "Via[0-1]_889:635_um" 467355 -1171664
        )
      )
      (net xled2
        (wire
          (path F.Cu 2540
            467255 -1139784
            471592 -1135447
            675638 -1135447
            712198 -1172007
            712198 -1174590
            733150 -1195542
            748672 -1195542
            754755 -1189459
            1643127 -1189459
            1648008 -1194340
            2043960 -1194340
            2152400 -1085900
          )
        )
        (wire
          (path B.Cu 2540
            398700 -1252700
            411400 -1240000
            411400 -1195639
            467255 -1139784
          )
        )
        (via "Via[0-1]_889:635_um" 467255 -1139784
        )
      )
      (net xled3
        (wire
          (path F.Cu 2540
            2152400 -1060500
            2024552 -1060500
            1896176 -1188876
            1662790 -1188876
            1658133 -1184219
            746581 -1184219
            743516 -1187284
          )
        )
        (wire
          (path B.Cu 2540
            703500 -1227300
            743516 -1187284
          )
        )
        (via "Via[0-1]_889:635_um" 743516 -1187284
        )
      )
      (net xled4
        (wire
          (path F.Cu 2540
            2152400 -1035100
            2028846 -1035100
            1880154 -1183792
            1672685 -1183792
            1667756 -1178863
            735094 -1178863
          )
        )
        (wire
          (path B.Cu 2540
            703500 -1252700
            691890 -1241090
            691890 -1222067
            735094 -1178863
          )
        )
        (via "Via[0-1]_889:635_um" 735094 -1178863
        )
      )
      (net xled5
        (wire
          (path F.Cu 2540
            720456 -1171170
            721251 -1170375
            735204 -1170375
            743019 -1162560
            743019 -1161036
            777335 -1126720
            1522996 -1126720
            1669503 -980213
            2122913 -980213
            2152400 -1009700
          )
        )
        (wire
          (path B.Cu 2540
            678100 -1252700
            666329 -1240929
            666329 -1222716
            717875 -1171170
            720456 -1171170
          )
        )
        (via "Via[0-1]_889:635_um" 720456 -1171170
        )
      )
      (net xled6
        (wire
          (path B.Cu 2540
            627300 -1252700
            651061 -1276461
            681614 -1276461
            689496 -1284343
            689496 -1294386
            697306 -1302196
            709812 -1302196
            713431 -1298577
            854209 -1298577
            863283 -1307651
            916673 -1307651
            976652 -1247672
            1617612 -1247672
            1695410 -1169874
            1695410 -1169626
            1703226 -1161810
            1715043 -1161810
            1765976 -1110877
            2033834 -1110877
            2152400 -992311
            2152400 -984300
          )
        )
      )
      (net xled7
        (wire
          (path F.Cu 2540
            424100 -1227300
            415710 -1218910
            415710 -1062823
            422341 -1056192
            431391 -1056192
            439500 -1064301
            439500 -1070426
            498972 -1129898
            690864 -1129898
            726258 -1165292
            733099 -1165292
            737936 -1160455
            737936 -1158768
            789357 -1107347
            1285370 -1107347
            1389496 -1003221
            1389496 -993423
            1397115 -985804
            1409812 -985804
            1434703 -1010695
            1608205 -1010695
            1660000 -958900
            2152400 -958900
          )
        )
      )
      (net xled8
        (wire
          (path B.Cu 2540
            729678 -1157034
            751941 -1179297
            751941 -1204259
            728900 -1227300
          )
        )
        (wire
          (path F.Cu 2540
            2152400 -933500
            1102558 -933500
            1008346 -1027712
            859000 -1027712
            729678 -1157034
          )
        )
        (via "Via[0-1]_889:635_um" 729678 -1157034
        )
      )
    )
  )
)
Deleted hardware/pdp8i/customlibraries/pdp8_library.dcm.
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
Deleted hardware/pdp8i/customlibraries/pdp8_library.lib.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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
Deleted hardware/pdp8i/customlibraries/pdp8footprintlib2.mod.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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














































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
PCBNEW-LibModule-V1  09/05/2015 20:49:52
# encoding utf-8
Units mm
$INDEX
D2
LED-3-PDP
LED-3-StrEight
RASPI_BPLUS
RASPI_BPLUS_MIRRORED
SIL-3PDP
SIL-5PDP
SW_KND2
SW_KND2_PDP
SW_KND2_PDP2
$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 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 54B2FF09 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 5.7 5.7 0 0 0
Dr 2.75 0 0
At STD N 00E0FFFF
Ne 0 ""
Po -29 0
$EndPAD
$PAD
Sh "H3" C 5.7 5.7 0 0 0
Dr 2.75 0 0
At STD N 00E0FFFF
Ne 0 ""
Po 29 0
$EndPAD
$PAD
Sh "H4" C 5.7 5.7 0 0 0
Dr 2.75 0 0
At STD N 00E0FFFF
Ne 0 ""
Po 29 -49
$EndPAD
$PAD
Sh "H1" C 5.7 5.7 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
$EndLIBRARY
Deleted hardware/pdp8i/schematic.pdf.

cannot compute difference between binary files

Added hardware/pidp8i/PDP8-cache.lib.


















































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added hardware/pidp8i/PDP8-rescue.lib.































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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
Added hardware/pidp8i/PDP8.cmp.


































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added hardware/pidp8i/PDP8.dsn.






















































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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))
  )
)
Added hardware/pidp8i/PDP8.kicad_pcb.





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
      )
    )
  )
)
Added hardware/pidp8i/PDP8.pro.






























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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
Added hardware/pidp8i/PDP8.rules.















































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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)
    )
  )
)
Added hardware/pidp8i/PDP8.sch.



























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added hardware/pidp8i/PDP8.ses.






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
          )
        )
      )
    )
  )
)
Added hardware/pidp8i/PDP8_cover.kicad_pcb.



















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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))

)
Added hardware/pidp8i/PDP8_cover.pro.








































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
Added hardware/pidp8i/customlibraries/pdp8_library.dcm.







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
Added hardware/pidp8i/customlibraries/pdp8_library.lib.










































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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
Added hardware/pidp8i/customlibraries/pdp8footprintlib.mod.





























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
Added hardware/pidp8i/customlibraries/pdp8footprintlib2.mod.




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added hardware/pidp8i/customlibraries/pdp8logo2.lib.





























1
2
3
4
5
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
Added hardware/pidp8i/customlibraries/pdp8logo2b.mod.







































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added hardware/pidp8i/customlibraries/pdp8logo3.mod.



















































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added hardware/pidp8i/logo/logo.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
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>
Added hardware/pidp8i/schematic.pdf.

cannot compute difference between binary files

Deleted lib/os8script.py.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#!/usr/bin/env python
# -*- 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 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
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")

# For the two arg form:
# The full destination spec is in group(1), The full source spec is in group(4).
# The device components, if any, are in group(2) for destination, and
# group(5) for source.
# The file components are in group(3) for destination, and group (6) for source.
# The destination file must either end in ".BN" or have no extension.
# The source must file either end in ".PA" or have no extension.
_two_arg_pal_re = re.compile ("^" + _os8_BN_fspec + "\s*<\s*" + _os8_PA_fspec + "$")

# For the 3 arg form:
# The full destination spec is in group(1), The full source spec is in group(7).
# The full listing spec is in group(4)
# The device components, if any, are in group(2) for destination, group(5)
# for listing, and group(8) for source.
# The file components are in group(3) for destination, and group(9) for source,
# and group(6) for listing.
# The destination file must either end in ".BN" or have no extension.
# The source must file either end in ".PA" or have no extension.
# The listing must either end in "LS" or have no extension.

_three_arg_pal_re = re.compile ("^" + _os8_BN_fspec + "\s*,\s*" + _os8_LS_fspec + "\s*<\s*" + _os8_PA_fspec + "$")

# Regular expression for syntax checking inside ABSLDR
# 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}

_build_replies = ["\\$", "SYS BUILT", "WRITE ZERO DIRECT\\?", "\\?BAD ARG",
                  "\\?BAD INPUT", "\\?BAD LOAD",
                  "\\?BAD ORIGIN", "\\?CORE", "\\?DSK", "\\?HANDLERS",
                  "I/O ERR", "\\?NAME", "NO ROOM", "SYS NOT FOUND",
                  "\\?PLAT", "\\?SYNTAX", "\\?SYS", "SYS ERR",
                  "\S+ NOT FOUND"]

# 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 ###########################################
  
  
  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
    self.line_ct_stack = []


  #### 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)
      if self.debug: print "options_disabled: " + str (self.options_disabled)
      if self.debug: 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_system_script 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 " + line
    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))
    return "success"


  #### cpto_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 self.verbose: print "Resuming OS/8 at line " + \
       str(self.line_ct_stack[0]) + "."

    self.simh.os8_restart()
    return "success"


  #### restart_command #############################################
  # Call the os8_restart in simh to resume OS/8.

  def restart_command (self, line, script_file):
    if self.verbose: print "Restarting OS/8 at line " + \
       str(self.line_ct_stack[0]) + "."

    self.simh.os8_restart()
    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)
    return "success"


  #### exit_command ###############################################
  # Call POSIX exit to exit the running program,
  # returning a numerical status value.

  def exit_command (self, line, script_file):
    m = re.match (_exit_arg_re, line)
    intfound = False
    if m != None:
      if m.group(1) != None:
        intfound = True
        status = int(m.group(1))
      elif m.group(2) != None:
        intfound = True
        status = int(m.group(2))
      else:
        intfound = False
    if self.verbose:
      if intfound: stat_str = str(status)
      else: stat_str = line
      print "Calling sys.exit (" +  stat_str + ") at line: " + \
        str(self.line_ct_stack[0]) + "."
    if intfound: sys.exit (status)
    else: sys.exit(line)


  #### 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):
  # Strings, regexps, and command arrays used by run_system
    commands = {"mount": self.mount_command,
                "boot": self.boot_command,
                "os8": self.os8_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}
  
    try:
      script_file = open(script_path, "r")
    except IOError:
      print script_path + " not found."
      return "fail"

    # 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)

    # 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, com, 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_send_ctrl('C')
      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_send_ctrl('C')
        return "err"
  
    self.simh.os8_send_line (new_val)
    return "cont"


  #### futil_exit ########################################################
  
  def futil_exit (self, com, line):
    self.simh.os8_send_line(line)
    return "break"


  #### futil_file ########################################################
  
  def futil_file (self, com, 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_send_ctrl('C')
      return "err"
    fname = match.group(2)
    expect_futil_file_str = "\n" + 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_send_ctrl('C')
      return "err"
    if match.group(2).strip() == "LOOKUP FAILED":
      print "Aborting because of FUTIL lookup failure on: " + fname
      self.simh.os8_send_ctrl('C')
      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, com, line):
    futil_specials = {
      "EXIT": self.futil_exit,
      "FILE": self.futil_file
    }
  
    if line[0].isdigit():
      # Treat the line as ODT
      return self.parse_odt(com, 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](fcom, line)


  #### run_patch_file ##################################################
  
  def run_patch_file (self, pathname):
    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"
  
    special_commands = {
      "ODT": self.parse_odt,
      "R": None,               # Get next parser.
      "FUTIL": self.parse_futil
    }
  
    inside_a_command = False
    the_command = ""
    the_command_parser = None
    
    # Resume OS/8 if necessary.
    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 (the_command, line)
        if retval == "break":
          inside_a_command = False
          self.simh.os8_send_ctrl('C')
        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 in special_commands:
          if com == "R":
            # Run command is special.  Take arg as the command and run it.
            com = rest
          inside_a_command = True
          the_command = com
          the_command_parser = special_commands[com]
  
        # We carefully separate com and args
        # But don't make much use of that yet.
        if self.verbose and self.debug: print line
        self.simh.os8_send_cmd ("\\.", line[1:])  # Skip Prompt.
  
    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
  

  #### call_pal8 #######################################################
  # Generic call out to PAL8 with error recovery.
  # We rely on the caller to have good specifications for source,
  # binary and optional listing files.
  
  def call_pal8 (self, source, binary):
    pal8_replies = ["ERRORS DETECTED: ", "BE\s+\S+", "CF\s+\S+", "DE\s+\S+", "DF", "IC\s+\S+", "ID\s+\S+",
                    "IE\s+\S+", "II\s+\S+", "IP\s+\S+", "IZ\s+\S+", "LD\s+\S+", "LG\s+\S+", "PE\s+\S+",
                    "PH\s+\S+", "RD\s+\S+", "SE\s+\S+", "UO\s+\S+", "US\s+\S+", "ZE\s+\S+", "\S+ NOT FOUND"]
  
    if self.verbose: print "Assembling " + source
    com_line = binary + "<" + source
    self.simh.os8_send_cmd ("\\.", "R PAL8")
    # Did the command successfully run and enter the command decoder?
    reply = self.simh._child.expect (self.simh._cd_replies)
    if reply != 0:
      print "PAL8 failed to start at line " + \
        str(self.line_ct_stack[0])
      return "fail"

    self.simh.os8_send_line (com_line)
    err_count = 0
    reply = self.simh._child.expect (pal8_replies)
    executed_line = self.simh._child.before.strip()
    reply_str = self.simh._child.after.strip()
    if reply == 0:
      self.simh._child.expect("\d+")
      err_count = int(self.simh._child.after.strip())
      reply_str += " " + self.simh._child.after.strip()
    if reply > 0 or err_count > 0:
      print "PAL8 Error: "
      print "\t*" + executed_line
      print "\t" + reply_str
      self.simh.os8_send_ctrl ('c')      # exit PAL8 Just in case.
      # We could do something better than just dying, I expect.
      return "fail"
    # self.simh.os8_send_ctrl ('[')      # exit PAL8
    return "success"


  #### 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
    self.simh.send_cmd(line)
    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
    self.simh.send_cmd(detach_comm)
    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
    self.simh.send_cmd(attach_comm)
    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.send_cmd("show " + line)
    retval = self.simh._child.expect(boot_replies)
    if retval == 1:
      print "Attempt to boot non-existent device: " + line
      return "die"
    m = re.match("^(\S+)\s(\S+),\s+(attached to |not attached)(\S+)?,\s+(.+)\r",
                 self.simh._child.after)
    if m == None:
      print "Could not determine if device " + line + " is attached."
      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
    self.simh.send_cmd(boot_comm)
    self.booted = True
    return "success"


  #### os8_command #####################################################
  
  def os8_command (self, line, script_file):
    if not self.booted:
      print "Cannot run os8 command at line " + \
        str(self.line_ct_stack[0]) + ". OS/8 has not been booted."
      return "die"

    os8_comm = line
    if self.verbose: print "Line: " + \
       str(self.line_ct_stack[0]) + ": os8_command: " + os8_comm

    # Resume OS/8 if necessary.
    if self.simh._context == "simh":
      self.resume_command(line, script_file)

    self.simh.os8_send_cmd ("\\.", os8_comm, self.debug)
    return "success"


  #### 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 not self.booted:
      print "Cannot run pal8 command at line " + \
        str(self.line_ct_stack[0]) + ". OS/8 has not been booted."
      return "die"

    m_2form = re.match (_two_arg_pal_re, line)
    if m_2form != None:

      # Resume OS/8 if necessary.
      if self.simh._context == "simh":
        self.resume_command(line, script_file)

      # Call the 2arg pal8 code that works hard at error analysis.
      return self.call_pal8 (m_2form.group(4), m_2form.group(1))
    else:
      m_3form = re.match (_three_arg_pal_re, line)
      if m_3form != None:
        # Just run the OS/8 command.
        os8_comm = "pal8 " + line
        if self.verbose: print "Line: " + \
           str(self.line_ct_stack[0]) + ": Calling 3-arg pal8 command: " + os8_comm
        self.simh.os8_send_cmd ("\\.", os8_comm)
      else:
        print "At line " + str(self.line_ct_stack[0]) + \
          ": Unrecognized pal8 form: {" + line + "}."
        return "fail"
    return "success"


  #### 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 = {"fotp": self.fotp_subcomm, "build": self.build_subcomm,
                    "absldr": self.absldr_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:
      # Resume OS/8 if necessary.
      if self.simh._context == "simh":
        self.resume_command(line, script_file)

      return sub_commands[m.group(1)](m.group(3), script_file)
  
  
  #### run_build_build #################################################
  # ***CAUTION***
  # When you do this you are instructing BUILD to
  # OVERWRITE the system area.  If you do this to your
  # running RK05 pack by mistake, you WILL make a mess
  # and need to re-run mkos8 to re-make it.
  
  def run_build_build (self, os8_spec, cd_spec):
    self.simh.os8_send_cmd ("\\$", "BUILD", debug=True)
    self.simh.os8_send_cmd ("LOAD OS/8: ", os8_spec, debug=True)
    self.simh.os8_send_cmd ("LOAD CD: ", cd_spec, debug=True)
    return "success"


  #### build_subcomm ###################################################
  
  def build_subcomm (self, old_line, script_file):
    # A race condition results if we send ^C when we are already at
    # Monitor level.  So need_exit gets set to False, when we know
    # we have already exited build, and are at the monitor prompt.
    need_exit = True
    os8_comm = "RU " + old_line
    if self.verbose: print "Line " + str(self.line_ct_stack[0]) + ": " + \
       os8_comm
    prompt_str = "\n\\$$"
    if self.debug:
      print "sending to simh: " + os8_comm
      print " and expecting prompt: '\\n\\\\$$'"
    self.simh.os8_send_cmd ("\\.", os8_comm)
    self.simh._child.expect(prompt_str)
    
    for line in script_file:
      # if self.debug:
      #  print "line: " + line
      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 build_sub not in _build_comm_regs:
        print "Unrecognized BUILD command at line " + \
          str(self.line_ct_stack[0]) + ": " + build_sub
        continue
  
      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."
          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."
          return "fail"
        
        if self.verbose:
          print "Line " + str(self.line_ct_stack[0]) + ": end BUILD"
        if self.debug:
          print "before: " + self.simh._child.before.strip()
          print "after: " + self.simh._child.after.strip()
        # Return to monitor level unless need_exit == False.
        if need_exit:
          self.simh.os8_send_ctrl ('c')

        return "success"
        
      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
          if self.debug:
            print "sending to simh: BUILD"
          self.simh.os8_send_line ("BUILD")

          build_build_replies = ["LOAD OS/8: "]
          build_build_replies.extend(_build_replies)
          
          if self.debug:
            print "expecting: " + str(build_build_replies)
          reply = self.simh._child.expect(build_build_replies)
          if self.debug:
            print "reply: " + str(reply)
            print "before: " + self.simh._child.before.strip()
            print "after: " + self.simh._child.after.strip()
          if reply != 0:
            print "No prompt for LOAD OS/8 in BUILD command within BUILD at line " + \
              str(self.line_ct_stack[0]) + "."
            print "Instead got: {" + self.simh._child.after + "}."
            print "Exiting BUILD."
            return "die"
          if self.debug:
            print "sending to simh: " + kbm_arg
          self.simh.os8_send_line (kbm_arg)

          build_build_replies = ["LOAD CD: "]
          build_build_replies.extend(_build_replies)
          
          if self.debug:
            print "expecting: " + str(build_build_replies)
          reply = self.simh._child.expect(build_build_replies)
          if self.debug:
            print "reply: " + str(reply)
            print "before: " + self.simh._child.before.strip()
            print "after: " + self.simh._child.after.strip()
          if reply != 0:
            print "No prompt for LOAD CD in BUILD command within BUILD at line " + \
              str(self.line_ct_stack[0]) + "."
            print "Instead got: {" + self.simh._child.after + "}."
            print "Exiting BUILD."
            return "die"
          if self.debug:
            print "sending to simh: " + cd_arg
          self.simh.os8_send_line (cd_arg)

          # Done with BUILD command dialog within BUILD.SV
          # Get that BUILD.SV prompt.
          if self.debug:
            print "Expecting prompt: '\\n\\\\$$'"
          self.simh._child.expect(prompt_str)
          if self.debug:
            print "Resume BUILD.SV command loop."
          continue

      comm = build_sub + " " + rest
      if self.verbose: print "Line " + str(self.line_ct_stack[0]) + \
         ": BUILD-> " + comm

      if self.debug:
        print "sending to simh: " + comm
      self.simh.os8_send_line (comm)
      if self.debug:
        print "expecting: " + str(_build_replies)
      reply = self.simh._child.expect(_build_replies)
      if self.debug:
        print "reply: " + str(reply)
        print "before: " + self.simh._child.before.strip()
        print "after: " + self.simh._child.after.strip()
      if reply > 3:
        print "BUILD error at line " + str(self.line_ct_stack[0]) + \
          " with command " + self.simh._child.before.strip()
        print "\t" + self.simh._child.after.strip()
        self.simh.os8_send_ctrl ('c')
      # Special case "BOOT" sub-command: May ask, "WRITE ZERO DIRECT?"
      if build_sub == "BOOT":
        if reply == 2:
          if self.debug:
            print "Boot received \"WRITE ZERO DIRECT?\""
            print "sending to simh: Y"
          self.simh.os8_send_line("Y")
          if self.debug:
            print "Expecting \"SYS BUILT\""
          reply = self.simh._child.expect("SYS BUILT")
          if self.debug:
            print "ZeroDir: reply: " + str(reply)
            print "before: " + self.simh._child.before.strip()
            print "after: " + self.simh._child.after.strip()
          need_exit = False
        elif reply == 0:
          reply = self.simh._child.expect("SYS BUILT")
          if self.debug:
            print "$: reply: " + str(reply)
            print "before: " + self.simh._child.before.strip()
            print "after: " + self.simh._child.after.strip()
          need_exit = False
        elif reply == 1:
          reply = self.simh._child.expect("\\.")
          if self.debug:
            print "SysBuilt: reply: " + str(reply)
            print "before: " + self.simh._child.before.strip()
            print "after: " + self.simh._child.after.strip()
    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
    self.simh.os8_send_cmd ("\\.", os8_comm)
    
    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]) + "."
        self.simh.os8_send_ctrl ('[')
        return retval
  
      # We could do some basic OS/8 command decoder synax checking here.
      comm = line
      if self.verbose: print "Line: " + \
         str(self.line_ct_stack[0]) + ": * " + line
      self.simh.os8_send_cmd ("\\*", line)
    print "Warning end of file encountered at line " + \
      str(self.line_ct_stack[0]) + " with no end of cdprog command block."
    self.simh.os8_send_ctrl ('[')
    return "fail"

  
  #### fotp_subcomm ####################################################
  
  def fotp_subcomm (self, old_line, script_file):
    os8_comm = "RU " + old_line
    if self.verbose: print "Line: " + \
       str(self.line_ct_stack[0]) + ": " + os8_comm
    self.simh.os8_send_cmd ("\\.", os8_comm)
    
    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)
        if rest == None or rest == "":
          print "Warning! end statement encountered inside fotp with no argument at line " + \
            str(self.line_ct_stack[0]) + "."
          return "fail"
        elif rest != "fotp":
          print "Warning! Mismatched begin/end blocks in FOTP at line " + \
            str(self.line_ct_stack[0]) + ".\nEncountered end: {" + rest + "}. Exiting FOTP."
          return "fail"

        if self.verbose: print "Line " + str(self.line_ct_stack[0]) + ": end FOTP"
        self.simh.os8_send_ctrl ('[')
        return "success"
  
      m = re.match(_fotp_re, line)
      if m == None:
        print "At line " + str(self.line_ct_stack[0]) + \
          ": ignoring mal-formed fotp file spec: {" + line + "}."
        continue
  
      comm = line
      if self.verbose: print "Line: " + \
         str(self.line_ct_stack[0]) + ": * " + line
      self.simh.os8_send_cmd ("\\*", line)
    print "Warning end of file encountered at line " + \
      str(self.line_ct_stack[0]) + " with no end of FOTP command block."
    return "fail"

  
  #### absldr_subcomm ##################################################
  # A clone of fotp_subcom.  Can we find a way to merge the common code?
  
  def absldr_subcomm (self, old_line, script_file):
    os8_comm = "RU " + old_line
    if self.verbose: print " line: " + \
       str(self.line_ct_stack[0]) + ": " + os8_comm
    self.simh.os8_send_cmd ("\\.", os8_comm)
    
    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)
        if rest == None or rest == "":
          print "Warning! end statement encountered inside ABSLDR with no argument at line " + \
            str(self.line_ct_stack[0]) + "."
          return "fail"
        elif rest != "absldr":
          print "Warning! Mismatched begin/end blocks in ABSLDR at line " + \
            str(self.line_ct_stack[0]) + ".\nEncountered end: {" + rest + "}. Exiting ABSLDR."
          return "fail"
          
        if self.verbose: print "End ABSLDR at line " + str(self.line_ct_stack[0]) + "."
        self.simh.os8_send_ctrl ('[')
        return "success"
  
      m = re.match(_absldr_re, line)
      if m == None:
        print "Ignoring mal-formed absldr file spec at line " + str(self.line_ct_stack[0]) + \
          ": {" + line + "}."
        continue
  
      comm = line
      if self.verbose: print "Line : " + str(self.line_ct_stack[0]) + "* " + line
      self.simh.os8_send_cmd ("\\*", line)
    print "Warning end of file encountered at line " + \
      str(self.line_ct_stack[0]) + "with no end of ABSLDR command block."
    return "fail"


  #### 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
  
     
  #### Data Structures ################################################
  #
  # The make procedures use helper procedures
  # to confirm that the relevant input image file exists and
  # to perform the file copies.
  #
  # A data structure called "image copyin"
  #    describes the image file pathname relative to an implied root,
  #    provides a message string when the action is run,
  #    names a default destination device for whole image content copies,
  #    offers an optional array of specific file copy actions.
  #
  # FUTURE: Parse source path for ".tu56" vs. ".rk05" for more general use.
  # Currently all code assumes a copyin comes from a DECtape image.
  #
  # Example: We Install all files for ADVENT, the Adventure game:
  #
  # advent_copyin = ['RKB0:', 'subsys/advent.tu56',  "Installing ADVENT...", None]
  #
  # A DECtape device is chosen for attachment in SIMH and
  # a 'COPY *.*' command is filled in with the Destination device, and the chosen DECtape.
  #
  # A data structer called "file copyin"
  #     provides override destination to allow renames or varied destinations.
  #     names individual files within a copyin to use
  #
  # Example:  To copy the C compiler we want all .SV files on SYS
  #           but everything else to RKB0:
  #           (Note the useful /V option to invert the match.)
  #
  # cc8_sv_file_copyin   = ['SYS:', '*.SV']
  # cc8_rest_file_copyin = ['RKB0:', '*.SV/V']
  #
  # A 'COPY' command is filled in with the override destination and
  # The file spec is used with the chosen dectape instead of "*.*"
  #
  
  #### copyin_pair #####################################################
  # Copy two images into two destinations with two messages
  #
  # Assumes our context is "in simh".
  # Assumes dt0 and dt1 are free.
  # Assumes rk0 is the boot device
  # Detaches dt0 and dt1 after using them.
  # copyin0 mounts on dt0.  copyin1 mounts on dt1.
  # Either copyin or both can be None
  
  def copyin_pair (s, copyin0, copyin1, debug):
    if debug:
      if copyin0:
        print "Copying: " + copyin0[1] + " to: " + copyin0[0] + "from dt0"
      else: print "copyin0 is empty."
      if copyin1:
        print "Copying: " + copyin1[1] + " to: " + copyin1[0] + "from dt1"
      else: print "copyin1 is empty."
      
    if not copyin0 and not copyin1: return   # Nothing to do.
  
    # The order of events here is a bit funky because we want
    # to use both DECtape drives but also
    # switch between SIMH and OS/8 as infrequently as possible.
  
    if copyin0: self.simh.send_cmd ("attach -r dt0 " + dirs.os8mi + copyin0[1])
    if copyin1: self.simh.send_cmd ("attach -r dt1 " + dirs.os8mi + copyin1[1])
  
    self.simh.os8_restart()
  
    if copyin0:
      if self.verbose: print copyin0[2]
      if copyin0[3]:                    # We have specific files to do.
        for file_copyin in copyin0[3]:
          self.simh.os8_send_cmd ("\\.", "COPY " + file_copyin[0] + "<DTA0:" + file_copyin[1])
      else:
        self.simh.os8_send_cmd ("\\.", "COPY " + copyin0[0] + "<DTA0:*.*")
  
    if copyin1:
      if self.verbose: print copyin1[2]
      if copyin1[3]:                    # We have specific files to do.
        for file_copyin in copyin1[3]:
          self.simh.os8_send_cmd ("\\.", "COPY " + file_copyin[0] + "<DTA1:" + file_copyin[1])
      else:
        self.simh.os8_send_cmd ("\\.", "COPY " + copyin1[0] + "<DTA1:*.*")
  
    self.simh.back_to_cmd("\\.")
  
    if copyin0: self.simh.send_cmd ("detach dt0")
    if copyin1: self.simh.send_cmd ("detach dt1")
  
  
  #### do_all_copyins ##################################################
  
  def do_all_copyins (s, copyins, debug):
    pair_idx = 0
    pair_ct = int(len(copyins) / 2)
    while pair_idx < pair_ct:
      copyin_pair(s, copyins[pair_idx * 2], copyins[pair_idx * 2 + 1], debug)
      pair_idx += 1
    if pair_ct * 2 < len(copyins):
      copyin_pair(s, copyins[len(copyins) - 1], None, debug)
  
  
  
Added lib/os8script.py.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
Deleted lib/simh.py.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#!/usr/bin/env python
# -*- 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-2019 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

class simh: 
  # 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]

  # Known OS/8 error strings and a flag indicating whether the error
  # dumps us back out to the OS/8 command monitor or leaves us in the
  # called program.

  _os8_errors = [
    # The date comment tells when each message is observed and validated
    #
    # OS/8 Handbook 1974 page 1-43/81 Keyboard Monitor Error Messages:
    ["MONITOR ERROR 2 AT \d+ \\(DIRECTORY I/O ERROR\\)", True],   # 2018.02.11
    ["MONITOR ERROR 5 AT \d+ \\(I/O ERROR ON SYS\\)", True],
    ["MONITOR ERROR 6 AT \d+ \\(DIRECTORY I/O ERROR\\)", True],
    ["(\S+) NOT AVAILABLE", False],
    ["(\S+) NOT FOUND", False],                                   # 2018.02.11
    # OS/8 Handbook 1974 page 1-51/89 Command Decoder Error Messages
    ["ILLEGAL SYNTAX", False],                                    # 2018.02.11
    ["(\S+) DOES NOT EXIST", False],
    # ["(\S+) NOT FOUND", False],                                 # See above
    ["TOO MANY FILES", False],
    # OS/8 Handbook 1974 page 1-75/113 CCL Error Messages
    ["BAD DEVICE", False],
    ["BAD EXTENSION", False],
    # OS/8 Handbook 1974 page 1-106/144 PIP Error Messages
    ["ARE YOU SURE", False],
    ["BAD DIRECTORY ON DEVICE #\s?\d+", False],
    ["BAD SYSTEM HEAD", False],
    ["CAN'T OPEN OUTPUT FILE", False],
    ["DEVICE #\d+ NOT A DIRECTORY DEVICE", False],
    ["DIRECTORY ERROR", False],
    ["ERROR DELETING FILE", False],
    ["ILLEGIAL BINARY INPUT, FILE #\d+", False],
    ["INPUT ERROR, FILE #\s?\d+", False],
    ["IO ERROR IN \\(file name\\) --CONTINUING", False],
    ["NO ROOM FOR OUTPUT FILE", False],
    ["NO ROOM IN \\(file name\\) --CONTINUING", False],
    ["OUTPUT ERROR", False],
    ["PREMATURE END OF FILE, FILE #\s?\d+", False],
    ["ZERO SYS?", False],
    # OS/8 Handbook 1974 page 2-81/244: DIRECT Error Messages
    ["BAD INPUT DIRECTORY", False],
    ["DEVICE DOES NOT HAVE A DIRECTORY", False],
    ["ERROR CLOSING FILE", False],
    ["ERROR CLOSING FILE", False],
    ["ERROR READING INPUT DIRECTORY", False],
    ["ILLEGAL \\*", False],
    # OS/8 Handbook 1974 page: 2-109/272: FOTP Error Messages
    ["ERROR ON INPUT DEVICE, SKIPPING \\((\S+)\\)", False],
    ["ERROR ON OUTPUT DEVICE, SKIPPING \\((\S+)\\)", False],
    ["ERROR READING INPUT DIRECTORY", False],
    ["ERROR READING OUTPUT DIRECTORY", False],
    ["ILLEGAL \\?", False],
    ["NO FILES OF THE FORM (\S+)", False],
    ["NO ROOM, SKIPPING \\((\S+)\\)", False],
    ["SYSTEM ERROR-CLOSING FILE", False],
    ["USE PIP FOR NON-FILE STRUCTURED DEVICE", False],
    ["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 what our command context is so our caller does
    # not need to explicitly call back_to_cmd() or sendcontrol ('e').
    # We keep track of the command context and transition automatically.
    self._context = "simh"
    
    # Parse our OS/8 Errors table into actionable chunks
    for error_spec in self._os8_errors:
      self._os8_error_match_strings.append(error_spec[0])
      self._os8_fatal_check.append(error_spec[1])

    self._pip_to_replies = ['\\^']
    self._pip_to_replies.extend(self._os8_error_match_strings)
    # Did command start the command decoder or die with a monitor error?
    self._cd_replies = ['\\*']
    self._cd_replies.extend(self._os8_error_match_strings)

    # 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')


  #### back_to_cmd ######################################################
  # Pause the simulation and return to the SIMH command prompt when the
  # simulated software emits the given prompt string.  Typically used to
  # wait for OS/8 to finish running a command so we can do something
  # down at the SIMH layer instead.

  def back_to_cmd (self, prompt):
    self._child.expect ("\n%s$" % prompt)
    self.os8_kbd_delay ()
    self._child.sendcontrol ('e')
    self._context = "simh"


  #### os8_get_file ####################################################
  # Rough inverse of os8_send_file.
  #
  # Both paths must be given and are used literally.  (Contrast our
  # inverse, where the destinatinon file name is produced from the
  # source if not given.)
  #
  # When this function is called to pull a file sent by our inverse, the
  # conversion should be lossless except for the transforms done by our
  # underlying utility tools, such as the LF -> CR+LF done by txt2ptp
  # but not undone by ptp2txt.
  #
  # Entry context should be inside OS/8.  Exit context is inside OS/8.

  def os8_get_file (self, intname, extname):
    # Attach a blank paper tape to the simulator.
    ptf = tempfile.NamedTemporaryFile (suffix = '.pt', delete = False)
    ptf.close ()
    ptn = ptf.name
    self.back_to_cmd ('\\.')
    self.send_cmd ('attach ptp ' + ptn)

    # Punch internal file to external paper tape image
    self.os8_restart ()
    self.os8_send_cmd ('\\.', 'PUNCH ' + intname);
    self.back_to_cmd ('\\.')        # wait for transfer to finish

    # Convert text file from SIMH paper tape format
    tool = os.path.join (pidp8i.dirs.build, 'bin', 'ptp2txt')
    self.send_cmd ('detach ptp')
    subprocess.call (tool + ' < ' +  ptn + ' > ' + extname, shell = True)

    # Return to OS/8, just because that's where we were on entry, so we
    # should not change that.
    self.os8_restart ()


  #### 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_cmd ####################################################
  # Wait for an OS/8 command prompt running within SIMH, then send the
  # given line.
  #
  # The default timeout may seem excessive, but it is based on hard
  # experience: when SIMH is running on a slow host with slow devices
  # (e.g. the byte-by-byte transfer of the TD8E tape controller) a
  # single OS/8 command can take a very long time if it requires a lot
  # of I/O.  If you are calling this for a command that you know for a
  # fact takes less time on all hosts and with all practical device
  # configurations, we encourage you to pass a smaller value.
  #
  # The caller must pass a prompt string because OS/8 has several
  # different prompt types: ., *, $, and #, at least.  Beware in passing
  # these that they're treated as regular expressions, so characters
  # special in Python REs must be escaped.  And then since the RE escape
  # character (\) is also special in Python strings, you must double-
  # escape *it*.  So, '\\$' is a reasonable thing to pass as the prompt
  # value, meaning "look for a literal $ character."
  #
  # This routine requires the caller to ensure that the system is in
  # OS/8 Keyboard Monitor context — that is, ready for another OS/8
  # command — before calling it.  While this routine is able to check
  # whether we're in OS/8 context as a prerequisite, it is not practical
  # for us to return the system to OS/8 context automatically from some
  # other context because that would require us to know the current
  # context in detail, but only the caller has that full knowledge.
  # 
  # Part of the problem is that in order to synchronize this object's
  # internal state machine with the SIMH + OS/8 + running program state,
  # we have to somehow provoke a prompt character from the running
  # program.  How do we do that without knowing the current context?
  # In some contexts, a CR or LF will do it, in others BS, and in others
  # it'll take Ctrl-C.  Then you have a new problem, with is that those
  # same characters aren't harmless: they'll change the very context
  # we're trying to probe!  For instance, a Ctrl-C sent to the OS/8
  # Keyboard Monitor just results in another prompt, but a Ctrl-C sent
  # to a program running *under* OS/8 might kill it.  Or it might be
  # treated as input.  Or it might be ignored entirely.
  #
  # There is no magic sequence we can send to SIMH or OS/8 to return the
  # system to OS/8 Keyboard Monitor context without either changing the
  # context in some way that might break the caller's needed state (e.g.
  # Ctrl-E, go 7600) or lose data (e.g. Ctrl-C) or fail entirely (e.g.
  # Enter.)  It's up to the caller to arrange this.

  def os8_send_cmd (self, prompt, line, debug=False, timeout=60):
    if self._context != 'os8': 
      print "OS/8 is not running. Cannot execute: " + line 
      return
    if debug:
      print "os8_send_cmd: expecting: " + prompt
      print "\tLast match before: {" + self._child.before + "}"
      print "\tLast match after: {" + self._child.after + "}"
    self._child.expect ("\n%s$" % prompt, timeout = timeout)
    self.os8_send_line (line)


  #### 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_send_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'


  #### 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_send_file ###################################################
  # Send a copy of a local text file to OS/8.  The local path may
  # contain directory components, but the remote must not, of course.
  #
  # If the destination file name is not uppercase, it will be so forced.
  #
  # If the destination file name is not given, it is taken as the
  # basename of the source file name.
  #
  # The file is sent via the SIMH paper tape device through PIP in its
  # default ASCII mode, rather than character by character for two reasons:
  #
  # 1. It's faster.  It runs as fast as the simulator can process the
  #    I/O instructions, without any os8_kbd_delay() hooey.
  #
  # 2. It allows lowercase input regardless of the way the simulator is
  #    configured.  ASCII is ASCII.
  #
  # Entry context should be inside OS/8.  Exit context is inside OS/8.

  def os8_send_file (self, source, dest = None):
    # Create path and file names not given
    bns = os.path.basename (source)
    if dest == None: dest = bns
    dest = dest.upper ()

    # Convert text file to SIMH paper tape format
    bdir = pidp8i.dirs.build
    pt   = os.path.join (bdir, 'obj', bns + '.pt')
    tool = os.path.join (bdir, 'bin', 'txt2ptp')
    subprocess.call (tool + ' < ' + source + ' > ' + pt, shell = True)

    # 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.
    self.back_to_cmd ('\\.')
    self.send_cmd ('attach -r ptr ' + pt)
    self.os8_restart ()
    self.os8_send_cmd ('\\.', 'R PIP')
    self.os8_send_cmd ('\\*', dest + '<PTR:')
    self._child.expect ('\\^')
    self.os8_send_ctrl ('[')      # finish transfer
    self._child.expect ('\\*')
    self.os8_send_ctrl ('[')      # exit PIP


  #### pip_error_handler ###############################################
  # Common error handler for os8_pip_to and os8_pip_from

  def pip_error_handler(self, caller, reply):
    print "PIP error from inside " + caller + ": "
    print "\t" + self._child.before.strip()
    print "\t" + self._child.after.strip()
    
    # Was this error fatal or do we need to clean up?
    # Remember we subtract 1 from reply to get index into error tables.
    if not self._os8_fatal_check[reply - 1]:
      # Non fatal error.  Exit pip to the monitor
      self.os8_send_ctrl ('[')      # exit PIP


  #### 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):
    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

    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.
    self.back_to_cmd ('\\.')
    self.send_cmd ('attach -r ptr ' + pt)
    self.os8_restart ()
    self.os8_send_cmd ('\\.', 'R PIP')
    # Was the start of PIP successful, or did we get a Monitor error?
    reply = self._child.expect (self._cd_replies)
    if reply != 0:
      self.pip_error_handler ("os8_pip_to", reply)
      return

    # Has the read-in been successful?
    self.os8_send_line (dest + '<PTR:' + option)
    reply = self._child.expect (self._pip_to_replies)
    if reply !=0:
      self.pip_error_handler("os8_pip_to", reply)
      if did_conversion:
        os.remove(pt)
      return

    self.os8_send_ctrl ('[')      # finish transfer
    self._child.expect ('\\*')
    self.os8_send_ctrl ('[')      # exit PIP
    # We could detach ptr and restart OS/8 here, but we don't need to.
    # Do 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):
    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

    self.back_to_cmd ('\\.')
    self.send_cmd ('attach ptp ' + path)
    self.os8_restart ()
    
    self.os8_send_cmd ('\\.', 'R PIP')
    # Was the start of PIP successful or did we get a Monitor error?
    reply = self._child.expect (self._cd_replies)
    if reply != 0:
      self.pip_error_handler ("os8_pip_from", reply)
      return
    
    self.os8_send_line ('PTP:<' + os8name + option)

    reply = self._child.expect (self._cd_replies)
    if reply !=0:
      self.pip_error_handler ("os8_pip_from", reply)
      # There is an empty PTP file we need to remove.
      os.remove(path)
      return

    self.os8_send_ctrl ('[')      # exit PIP
    self.back_to_cmd ('\\.')
    self.send_cmd ('detach ptp')  # Clean flush of buffers.
    self.os8_restart ()

    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)


  #### os8_send_line ###################################################
  # Core of os8_send_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_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 xrange (0, len (str)):
      self._child.send (str[i])
      self.os8_kbd_delay ()


  #### os8_resume #######################################################
  # Resume OS/8.
  #
  # It would be nice if we could just send  the "cont" command
  # and have python expect and OS/8 synch right up.
  # But so far we have not figured out how to do that.
  # To resume OS/8 from SIMH we need to provoke a prompt.
  # Typing a rubout or ^U at a SIMH terminal session does this.
  # But not when SIMH is run under python expect.
  # We don't know why.
  #
  # boot works
  # go 7600 works
  # ^C <pause> \n\r works.
  #
  # The resume command uses the ^C method as the least disruptive
  # to system state.

  def os8_resume (self):
    if self._context == "os8": return   # Already running.
    
    self.send_cmd("cont")   # sets os8 context for us.

    # Now provoke a keyboard monitor prompt.
    self.os8_send_ctrl('c')
    self.os8_kbd_delay()
    self.os8_send_str('\r\n')
  

  #### os8_restart #######################################################
  # Called while in the SIMH command prompt, this restarts OS/8.
  #
  # This one-line function exists to abstract the method we use and to
  # document the reason we do it this way.
  #
  # Currently we do this by calling the OS/8 command entry point, which
  # has the virtue that it forces another . prompt, which keeps the
  # send/expect sequencing simple when switching between OS/8 and SIMH
  # command modes.
  #
  # That is why we don't use "cont" here instead: it requires that the
  # caller always be aware of when the . prompt went out; complicated.
  #
  # Another simple alternative is "boot rk0", which actually benchmarks
  # a smidge faster here.  We choose this method instead because we
  # expect that some of our callers will want to do several different
  # things in a single OS/8 session, which rebooting would screw up.

  def os8_restart (self):
    self.send_cmd ("go 7600")


  #### os8_squish ########################################################
  # Wraps the OS/8 SQUISH command for a given device.

  def os8_squish (self, device):
    self.os8_send_cmd ('\\.', "SQUISH " + device + ":")
    self.os8_kbd_delay ()
    self._child.send ("Y\r");


  #### 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):
    self.back_to_cmd ('\\.')
    self.send_cmd ('de 00200-07577 0')
    self.send_cmd ('de 10000-17577 0')
    self.send_cmd ('de 20000-27577 0')
    self.send_cmd ('de 30000-77777 0')
    self.os8_restart ()


  #### quit ############################################################
  # Quits the simulator and waits for it to exit

  def quit (self):
    self.send_cmd ("q")
    self._child.expect (pexpect.EOF)


  #### 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 ()


  #### send_cmd ########################################################
  # Wait for a SIMH command prompt and then send the given command.
  # If we are not in the simh context send ^e and set context "simh".
  # If we are not in simh context, send ^e set context "simh"
  #    and hope for the best.
  # If we issue a command that enters os8 context, set context "os8".
  # Note exiting out of OS/8 into the SIMH context is a bit of a
  # trap door. Resynchronizing with python expect requires provoking
  # a prompt, and prompts are context specific.
  # Perhaps we should require separate and explicit commands to
  # escape to SIMH. But for now, just be careful to use os8_resume
  # after calling send_cmd.
  
  def send_cmd (self, cmd):
    if self._context == "os8":
      self._child.expect ("\n\\.$")
      self._child.sendcontrol ('e')
      self._context = "simh"
    elif self._context != "simh":
      self._child.sendcontrol ('e')
      self._context = "simh"
      
    self._child.expect ("sim> $")
    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"


  #### send_line #######################################################
  # Sends the given line "blind", without waiting for a prompt.

  def send_line (self, line):
    self._child.sendline (line)


  #### set_logfile #####################################################

  def set_logfile (self, lf):
    self._child.logfile = lf


  #### 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)


  #### 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


  #### 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):
    self.send_cmd ('de all 0')
  

  #### 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.

  def do_simh_show (self, name):
    supported_shows = ["dt", "td", "tti", "rx"]
    if name not in supported_shows: return None
    
    ucname = name.upper()
    self.send_cmd("show " + name)
    self._child.expect(ucname + "\s+(.+)\r")
    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] + ")"
            self.send_cmd(det_comm)
        self.send_cmd("set " + from_tape + " disabled")

    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:
      self.send_cmd("set " + to_tape + " enabled")    

    # 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..."
      self.send_cmd("set rx enabled")
      # 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] + ")"
          self.send_cmd(det_comm)

    self.send_cmd("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

    self.send_cmd("set 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


Added lib/simh.py.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
Deleted media/etos/etos.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30






























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
At main console:
----------------
To run ETOS: R ETOS to start the operating system. Hit return at the option prompt.

To login enter LOGIN and then hit return which should then give the login prompt.  No prompt will be displayed for entering the login command. At the prompt enter account number such as 0,3 and hit return. Then enter the password at the password prompt. On the distribution ETOS pack the following users exist:

At terminal (telnet localhost 4000):
-----------

LOGIN;0,4 USER1 <CTRL-M>


Users:
------
Account Password
0,4     USER1
0,5     USER2

Shutdown:
---------
You can To shutdown enter
. ^VS      (^V is control-V)
!PRIV 4040
!SHUTUP 

See:
----
http://www.pdp8.net/os/etos/ (introduction)
http://highgate.comm.sfu.ca/pdp8/index.html (manuals, search page for ETOS)
ftp://ftp.pdp8online.com/images/etos/ (disk images)
Deleted media/etos/etosv5b-demo.rk05.
Deleted media/os8/.agignore.
1
2
3



-
-
-
*.tu56
*.rk05
*.rk05.save
Changes to media/os8/.ignore.
1




1
2
3
-
+
+
+
.agignore
*.tu56
*.rk05
*.rk05.save
Added media/os8/PALTST.PA.











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

$
Changes to media/os8/README.md.
80
81
82
83
84
85
86
87

88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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 Focal, Adventure, etc.
| 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`.
| `local.tu56`    | Files created for or vetted by the PiDP-8/I project; used at build time

[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
Deleted media/os8/local.tu56.

cannot compute difference between binary files

Added media/os8/ock-init.tx.in.











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
Deleted media/os8/patches/ABSLDR-21.29.1M-v6C.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,
Deleted media/os8/patches/BASIC.UF-31.5.1M-V5B.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
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
Deleted media/os8/patches/BATCH-31.23.1M-v7B.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

























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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
Deleted media/os8/patches/BLOAD-31.10.1M-v5B.patch8.
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.
Deleted media/os8/patches/BRTS-31.11.1M-v5B.patch8.
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
Deleted media/os8/patches/BRTS-31.11.2-O.patch8.
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.
Deleted media/os8/patches/BRTS-31.11.3-O.patch8.
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
Deleted media/os8/patches/BRTS-31.11.5-x.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




























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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		
Deleted media/os8/patches/CREF-21.15.1M-v5B.patch8.
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
Deleted media/os8/patches/CREF-21.15.2M-v5C.patch8.
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.
Deleted media/os8/patches/DLOG.RA.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Deleted media/os8/patches/EDIT-21.17.1M-v12B.patch8.
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
Deleted media/os8/patches/EDIT-21.17.2M-v12C.patch8.
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
Deleted media/os8/patches/EDIT-21.17.3M-v12D.patch8.
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
Deleted media/os8/patches/EDIT-21.17.4M-V12C.patch8.
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
Deleted media/os8/patches/F4-21.1.2M-v4B.patch8.
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.
Deleted media/os8/patches/F4-51.3.1M-v4C.patch8.
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.
Deleted media/os8/patches/F4-51.3.2M-v4x.patch8.
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
Deleted media/os8/patches/FORLIB-51.10.1M.patch8.
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
Deleted media/os8/patches/FOTP-21.19.1M-V9B.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
























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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.
Deleted media/os8/patches/FRTS-51.3.3-O.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
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.
Deleted media/os8/patches/FUTIL-31.21.1M-v7B.patch8.
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
Deleted media/os8/patches/FUTIL-31.21.2M-v7D.patch8.
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.
Deleted media/os8/patches/FUTIL-31.21.3O.patch8.
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.
Deleted media/os8/patches/LINK-40.2.1M-v1D.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
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
Deleted media/os8/patches/LINK-40.2.2M-v1E.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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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
Deleted media/os8/patches/LINK-40.2.3M-v1F.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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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


Deleted media/os8/patches/LQP-21.49.1M-vB.patch8.
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.
Deleted media/os8/patches/MACREL-40.5.1M-v1D.patch8.
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
Deleted media/os8/patches/MACREL-40.5.2M-v1E.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
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
Deleted media/os8/patches/MCPIP-21.21M-v6B.patch8.
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
Deleted media/os8/patches/MSBAT-31.22.1M-v3B.patch8.
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.
Deleted media/os8/patches/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
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
********
Deleted media/os8/patches/PAL8-21.22.1M-v10B.patch8.
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.
Deleted media/os8/patches/PAL8-21.22.2M-v10C.patch8.
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
Deleted media/os8/patches/PAL8-21.22.3M-v10D.patch8.
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

Deleted media/os8/patches/PAL8-21.22.4M.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
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
Deleted media/os8/patches/PIP-21.23.1M-v12B.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





























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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

Deleted media/os8/patches/PIP10-21.24.1M-v3B.patch8.
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.
Deleted media/os8/patches/SABR-21.91.1M-v18B.patch8.
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.
Deleted media/os8/patches/SET-21.26.1M-v1C.patch8.
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
Deleted media/os8/patches/SET-21.26.2M-v1D.patch8.
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
Deleted media/os8/patches/SET-21.26.3M-v1E.patch8.
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.
Deleted media/os8/patches/TECO-31.20.01O.patch8.
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
Deleted media/os8/patches/TECO-31.20.02O.patch8.
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
Deleted media/os8/patches/TECO-31.20.03O.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




























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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
Deleted media/os8/patches/TECO-31.20.04O.patch8.
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
Deleted media/os8/patches/TECO-31.20.05M-v5A.patch8.
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
Deleted media/os8/patches/TECO-31.20.06M-v5B.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

























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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
Deleted media/os8/patches/TECO-31.20.07M.v5C.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

























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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
Deleted media/os8/patches/TECO-31.20.08M-v5.04.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
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
Deleted media/os8/patches/TECO-31.20.10M-v5.05.patch8.
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
Deleted media/os8/patches/TECO-31.20.11M-v5.06.patch8.
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
Deleted media/os8/patches/TECO-31.20.12M-v5.07.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
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
Deleted media/os8/patches/TECO-31.20.13M-v5.08.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
























-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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
Deleted media/os8/patches/patch-list.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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
Deleted media/os8/scripts/README.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














































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# OS/8 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].

Here is an inventory of the scripts and their actions.

| Script Name        | Function
|--------------------|-------------------------------------------
| v3d-dist-rk05.os8  | Construct an OS/8 v3d rk05 image from
|                    | distribution media, configured by auto.def
| v3d-rk05.os8       | Apply patches to output of v3d-dist.rk05.os8
| 		     | to construct a default OS/8 rk05 boot image.
| v3d-src-rk05.os8   | Construct an OS/8 rk05 image containing souces
| 		     | from distribution media.
| all-tu56.os8	     | Construct 4 tu56 images based on --enable
| 		     | parameters: v3d or v3f with tc08 or td12k
|		     | system heads.
| cusp-copyin.os8    | Include script used by all-tu56.os8 to
| 		     | copy Commonly Used System Programs onto
|		     | the tu56 image under construction.
| v3f-control.os8    | Perform assembly or BATCH operations to produce
| 		     | binaries from v3f sources.

There are also utility/test scripts:

| Script Name        | Function
|--------------------|-------------------------------------------
| version-test.os8   | Test the `begin enabled version` functionality
| 		     | in os8-run.
| copy-test.os8	     | Test the `cpto` and `cpfrom` os8-run commands.
| err-test.os8	     | Used to provoke errors in os8-run and test
| 		     | behavior.
| restart-test.os8   | Test the `restart` os8-run command.
| patch-test.os8     | Test the `patch` os8-run command.
| v3d-reset-tc08.os8 | Utility: re-configure the default OS/8 v3d
| 		     | rk05 boot image to use TC08 DECtape (instead
|		     | of TD8E) drivers.

[os8-run-doc]: /doc/trunk/doc/os8-run.md

## License

Copyright © 2016-2018 by Bill Cattey. This document is licensed under
the terms of [the SIMH license][sl].
Deleted media/os8/scripts/all-tu56.os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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



















































































































































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Builds a bootable dectape image for either v3d or v3f.
# Pieces come from, as needed:
# v3d.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.rk05 required scratch
boot rk0

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.

  os8 SET SYS NO INIT
  
  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
  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
  # v3f needs device drivers from a V3d Distribution DECtape
  mount dt1 $os8mi/al-4712c-ba-os8-v3d-2.1978.tu56 readonly required

  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.
  umount dt1
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 $media/os8/scripts/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
Deleted media/os8/scripts/cc8-tu56.os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72








































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Script to create the cc8.tu56 image that hosts the
# OS/8 Native C compiler.
# Note that because the patched, default system packs,
# v3d.rk05 rely upon this image as a prerequisite, we
# build with a copy of v3d-dist.rk05

# copy $os8mo/v3d-dist.rk05 $os8mo/temp-v3d-dist.rk05
# mount rk0 $os8mo/temp-v3d-dist.rk05 required
mount rk0 $os8mo/v3d-dist.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:
# fib.c, calc,c, ps.c

# Copy source files into DSK for use.
cpto $src/src/cc8/os8/header.sb DSK:
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: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/fib.c DTA0:
cpto $obj/cc8/os8/calc.c DTA0:
cpto $obj/cc8/os8/ps.c DTA0:
Deleted media/os8/scripts/copy-test.os8.
1
2
3
4
5
6
7
8
9
10










-
-
-
-
-
-
-
-
-
-
mount rk0 $bin/v3d.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/
Deleted media/os8/scripts/cusp-copyin.os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104








































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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:<RKA1:?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
DTA0:<RKB0:HELLO.BA
end cdprog RKA0:FOTP.SV
end default basic

Deleted media/os8/scripts/err-test.os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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.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

Deleted media/os8/scripts/patch-test.os8.
1
2
3
4
5
6
7
8
9









-
-
-
-
-
-
-
-
-
# Test the patch command.

# copy ./v3d-dist.rk05 ./v3d.rk05
mount rk0 ./v3d.rk05 required

boot rk0

patch ../media/os8/patches/FOTP-21.19.1M-V9B.patch8
patch ../media/os8/patches/PAL8-21.22.4M.patch8
Deleted media/os8/scripts/restart-test.os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
















-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
mount rk0 $bin/v3d.rk05 required

boot rk0

mount dt0 $os8mo/copy-test.tu56

restart

os8 DIR DTA0:

umount dt0
mount dt0 v3f-tc08.tu56

resume

os8 DIR DTA0:
Deleted media/os8/scripts/v3d-dist-rk05.os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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







































































































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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 dt1

boot rk0

os8 ZERO RKB0:

# Do copyins here.

# OS/8 V3D extensions
umount dt0
mount dt0 $os8mi/al-4761c-ba-os8-v3d-ext.1978.tu56 ro required
# resume
os8 COPY RKA0:<DTA0:*.*

# Copying in Music score files and source code...
begin enabled music
umount dt1
mount dt1 $os8mi/subsys/music.tu56 ro required
# resume
os8 COPY RKB0:<DTA1:*.*
end enabled music

# Adventure
begin default advent
umount dt1
mount dt1 $os8mi/subsys/advent.tu56 ro required
# resume
os8 COPY RKB0:<DTA1:*.*
end default advent

# BASIC games and demos
begin default ba
umount dt1
mount dt1 $os8mi/subsys/ba.tu56 ro required
# resume
os8 COPY RKB0:<DTA1:*.*
end default ba

# Kermit-12
begin default k12
umount dt1
mount dt1 $os8mi/subsys/k12.tu56 ro required
# resume
os8 COPY RKA0:<DTA1:*.*
end default k12

# FORTRAN IV
begin default fortran-iv
umount dt1
mount dt1 $os8mi/subsys/al-4549d-ba-fr4-v3d-1.1978.tu56 ro required
# resume
os8 COPY RKA0:<DTA1:*.*
end default fortran-iv

# MACREL V2 and new FUTIL V8B
begin default macrel
umount dt1
mount dt1 $os8mi/al-5642c-ba-macrel-v2-futil-v8b-by-hand.tu56 ro required
# resume
os8 COPY RKA0:<DTA1:MACREL.SV,LINK.SV,KREF.SV,OVRDRV.MA,FUTIL.SV
end default macrel

# Files from local.tu56
umount dt1
mount dt1 $os8mi/local.tu56 ro required
# resume
# Case conversion batch scripts
os8 COPY RKA0:<DTA1:?CSYS.BI
os8 COPY RKA0:<DTA1:?CBAS.BI

begin default chess
os8 COPY RKA0:<DTA1:CHESS.*
end default chess

# TECO VTEDIT setup
begin enabled vtedit
os8 COPY RKA0:<DTA1:VTEDIT.*
os8 COPY RKA0:<DTA1:TECO.IN
end enabled vtedit

# DCP Disassembler: DCP24.SV, and DCP16.SV as DCP.SV
begin default dcp
os8 COPY RKA0:<DTA1:DCP24.SV,DCP.SV,DCP16.SV
end default dcp

# FOCAL69 .BN files installed on DSK:
begin enabled focal69
umount dt1
mount dt1 $os8mi/subsys/focal69.tu56 ro required
os8 COPY RKB0:<DTA1:FOCAL.BN,4WORD.BN,4KVT.BN,8KVT.BN,8KNOVT.BN
end enabled focal69

# U/W FOCAL
begin default uwfocal
umount dt1
mount dt1 $os8mi/subsys/uwfocal-v4e-2.tu56 ro required
# resume
os8 COPY RKA0:<DTA1:UWF16K.SV
end default uwfocal

# 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
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
# resume
os8 SQUISH DSK:/O
os8 SQUISH SYS:/O
Deleted media/os8/scripts/v3d-reset-tc08.os8.
1
2
3
4
5
6
7
8
9
10
11











-
-
-
-
-
-
-
-
-
-
-
# If a script setting TD8E in the default system packs blows out
# Run this script to fix it.

mount rk0 $bin/v3d.rk05 required

# The saved BUILD will just work.
boot rk0
begin build SYS:BUILD.SV
BOOT
end build
os8 SET SYS INIT
Deleted media/os8/scripts/v3d-rk05.os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146


















































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# Takes an OS8 V3D binary rk05 image and applies patches.

copy $os8mo/v3d-dist.rk05 $os8mo/v3d.rk05
mount rk0 $os8mo/v3d.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 $os8mi/patches/BASIC.UF-31.5.1M-V5B.patch8
patch $os8mi/patches/BATCH-31.23.1M-v7B.patch8
patch $os8mi/patches/BLOAD-31.10.1M-v5B.patch8
patch $os8mi/patches/BRTS-31.11.1M-v5B.patch8
# patch $os8mi/patches/BRTS 31.11.2O disables 8th bit parity. Recommended.
patch $os8mi/patches/BRTS-31.11.2-O.patch8
# patch $os8mi/patches/BRTS 31.11.3O enables 132 column output. Recommended.
patch $os8mi/patches/BRTS-31.11.3-O.patch8
patch $os8mi/patches/BRTS-31.11.5-x.patch8
patch $os8mi/patches/CREF-21.15.1M-v5B.patch8
patch $os8mi/patches/CREF-21.15.2M-v5C.patch8
patch $os8mi/patches/EDIT-21.17.1M-v12B.patch8
patch $os8mi/patches/EDIT-21.17.2M-v12C.patch8
patch $os8mi/patches/EDIT-21.17.3M-v12D.patch8
# patch $os8mi/patches/EDIT 21.17.4 overwrites patch in 21.17.2. DO NOT APPLY THIS PATCH
# patch $os8mi/patches/EDIT-21.17.4M-V12C.patch8

begin default fortran_iv
patch $os8mi/patches/F4-21.1.2M-v4B.patch8
patch $os8mi/patches/F4-51.3.1M-v4C.patch8
patch $os8mi/patches/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
# 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 $os8mi/patches/FRTS-51.3.3-O.patch8

# OS/8 commands to mount DECtape with new FORLIB.RL
# and put it in place.
mount dt0 $os8mi/local.tu56 ro required
# resume
os8 DEL SYS:FORLIB.RL
os8 COPY SYS:<DTA0:FORLIB.RL
end default fortran_iv

patch $os8mi/patches/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 $os8mi/patches/FUTIL-31.21.1M-v7B.patch8
patch $os8mi/patches/FUTIL-31.21.2M-v7D.patch8
# patch $os8mi/patches/FUTIL 31.21.3O switches XS format. Recommend to leave it out.
# patch $os8mi/patches/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 $os8mi/patches/LQP-21.49.1M-vB.patch8
patch $os8mi/patches/MCPIP-21.21M-v6B.patch8
patch $os8mi/patches/MSBAT-31.22.1M-v3B.patch8
patch $os8mi/patches/PAL8-21.22.1M-v10B.patch8
patch $os8mi/patches/PAL8-21.22.2M-v10C.patch8
patch $os8mi/patches/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 $os8mi/patches/PAL8-21.22.4M.patch8
patch $os8mi/patches/PIP-21.23.1M-v12B.patch8
patch $os8mi/patches/PIP10-21.24.1M-v3B.patch8

begin default fortran_ii
patch $os8mi/patches/SABR-21.91.1M-v18B.patch8
end default fortran_ii

patch $os8mi/patches/SET-21.26.1M-v1C.patch8
patch $os8mi/patches/SET-21.26.2M-v1D.patch8
patch $os8mi/patches/SET-21.26.3M-v1E.patch8
# patch $os8mi/patches/TECO 31.20.1 Unconditional no case flagging. Not recommended
# patch $os8mi/patches/TECO-31.20.01O.patch8
# patch $os8mi/patches/TECO 31.20.2 Turns off verbose errors. Not recommended.
# patch $os8mi/patches/TECO-31.20.02O.patch8
# patch $os8mi/patches/TECO 31.20.3 Turns off Yank overwrite warning. Not recommended.
# patch $os8mi/patches/TECO-31.20.03O.patch8
# patch $os8mi/patches/TECO 31.20.4 Special support for VT05. Not recommended.
# patch $os8mi/patches/TECO-31.20.04O.patch8
patch $os8mi/patches/TECO-31.20.05M-v5A.patch8
patch $os8mi/patches/TECO-31.20.06M-v5B.patch8
patch $os8mi/patches/TECO-31.20.07M.v5C.patch8
patch $os8mi/patches/TECO-31.20.08M-v5.04.patch8
patch $os8mi/patches/TECO-31.20.10M-v5.05.patch8
patch $os8mi/patches/TECO-31.20.11M-v5.06.patch8
patch $os8mi/patches/TECO-31.20.12M-v5.07.patch8
patch $os8mi/patches/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

os8 SQUISH DSK:/O
os8 SQUISH SYS:/O

# Ian Schofield's CC8 compiler
# Don't install this in v3d-dist because we need
# v3d packs to build it.
begin default cc8
umount dt1
mount dt1 $os8mo/cc8.tu56 ro required
# resume
os8 COPY RKA0:<DTA1:*.SV
os8 COPY RKB0:<DTA1:*.SV/V
end default cc8

Deleted media/os8/scripts/v3d-src-rk05.os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52




















































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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.

mount rk0 $os8mo/v3d.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

resume

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

resume

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

resume

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

resume

os8 COPY RKB1:<DTA0:*.*
os8 COPY RKA1:<DTA1:*.*
Deleted media/os8/scripts/v3f-control.os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42










































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
# 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.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
Deleted media/os8/scripts/version-test.os8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
Changes to media/os8/subsys/README.md.
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
| ----------------------------------------------------------------------------
| `advent.tu56`           | [OS/8 Adventure][os8a] v2.4
| `ba.tu56`               | Several BASIC programs in OS/8 \*.BA file format from DEC's book ["101 BASIC Computer Games"][bcg]
| `cc8.tu56`              | Ian Schofield's [CC8 OS/8 C compiler system][cc8]
| `k12.tu56`              | [Kermit-12][k12] for OS/8, OS/78, OS/278, and OS/12
| `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
54
55
56
57
58
59
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.


[bcg]:  https://archive.org/details/bitsavers_decBooks10Mar75_26006648
[cc8]:  https://groups.google.com/d/msg/pidp-8/ycs_KOI4vdg/Zr0bifJxAgAJ
[k12]:  http://www.columbia.edu/kermit/pdp8.html
[os8a]: http://www.rickmurphy.net/advent/
[rfi]:  https://en.wikipedia.org/wiki/Electromagnetic_interference
[tlrm]: /doc/trunk/README.md
Deleted media/os8/subsys/advent.tu56.

cannot compute difference between binary files

Deleted media/os8/subsys/ba.tu56.

cannot compute difference between binary files

Deleted media/os8/subsys/focal69.tu56.

cannot compute difference between binary files

Deleted media/os8/subsys/k12.tu56.

cannot compute difference between binary files

Deleted media/os8/subsys/music.tu56.

cannot compute difference between binary files

Deleted media/os8/subsys/uwfocal-v4e-1.tu56.

cannot compute difference between binary files

Deleted media/os8/subsys/uwfocal-v4e-2.tu56.

cannot compute difference between binary files

Added patches/os8/ock/#patch-list.txt#.





























1
2
3
4
5
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
Added patches/os8/ock/ABSLDR-21.29.1M-v6C.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,
Added patches/os8/ock/BLOAD-35.51.1M-v5C.patch8.
















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.
Added patches/os8/ock/BRTS-31.11.3-O.patch8.














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
Added patches/os8/ock/CREF-21.15.1M-v5B.patch8.











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
Added patches/os8/ock/CREF-21.15.2M-v5C.patch8.
















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.
Added patches/os8/ock/F4-51.3.2M-v4x.patch8.













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
Added patches/os8/ock/PAL8-35.14.1M-V13B.patch8.
















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
Added patches/os8/ock/SABR-21.91.1M-v18B.patch8.


















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.
Added patches/os8/ock/TECO-31.20.01O.patch8.













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
Added patches/os8/ock/TECO-31.20.02O.patch8.


















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
Added patches/os8/ock/TECO-31.20.03O.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added patches/os8/ock/TECO-31.20.04O.patch8.




















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
Added patches/os8/ock/TECO-31.20.05M-v5A.patch8.

















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
Added patches/os8/ock/TECO-31.20.06M-v5B.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added patches/os8/ock/TECO-31.20.07M.v5C.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added patches/os8/ock/TECO-31.20.08M-v5.04.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
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
Added patches/os8/ock/TECO-31.20.10M-v5.05.patch8.















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
Added patches/os8/ock/TECO-31.20.11M-v5.06.patch8.














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
Added patches/os8/ock/TECO-31.20.12M-v5.07.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
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
Added patches/os8/ock/TECO-31.20.13M-v5.08.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added patches/os8/v3d/ABSLDR-21.29.1M-v6C.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,
Added patches/os8/v3d/BASIC.UF-31.5.1M-V5B.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
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
Added patches/os8/v3d/BATCH-31.23.1M-v7B.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added patches/os8/v3d/BLOAD-31.10.1M-v5B.patch8.
















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.
Added patches/os8/v3d/BRTS-31.11.1M-v5B.patch8.
















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
Added patches/os8/v3d/BRTS-31.11.2-O.patch8.













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.
Added patches/os8/v3d/BRTS-31.11.3-O.patch8.














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
Added patches/os8/v3d/BRTS-31.11.5-x.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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		
Added patches/os8/v3d/CREF-21.15.1M-v5B.patch8.











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
Added patches/os8/v3d/CREF-21.15.2M-v5C.patch8.
















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.
Added patches/os8/v3d/DLOG.RA.










































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added patches/os8/v3d/EDIT-21.17.1M-v12B.patch8.












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
Added patches/os8/v3d/EDIT-21.17.2M-v12C.patch8.



















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
Added patches/os8/v3d/EDIT-21.17.3M-v12D.patch8.













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
Added patches/os8/v3d/EDIT-21.17.4M-V12C.patch8.
















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
Added patches/os8/v3d/F4-21.1.2M-v4B.patch8.























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.
Added patches/os8/v3d/F4-51.3.1M-v4C.patch8.














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.
Added patches/os8/v3d/F4-51.3.2M-v4x.patch8.













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
Added patches/os8/v3d/FORLIB-51.10.1M.patch8.
















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
Added patches/os8/v3d/FOTP-21.19.1M-V9B.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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.
Added patches/os8/v3d/FRTS-51.3.3-O.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
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.
Added patches/os8/v3d/FUTIL-31.21.1M-v7B.patch8.
















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
Added patches/os8/v3d/FUTIL-31.21.2M-v7D.patch8.




















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.
Added patches/os8/v3d/FUTIL-31.21.3O.patch8.

















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.
Added patches/os8/v3d/LINK-40.2.1M-v1D.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
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
Added patches/os8/v3d/LINK-40.2.2M-v1E.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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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
Added patches/os8/v3d/LINK-40.2.3M-v1F.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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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


Added patches/os8/v3d/LQP-21.49.1M-vB.patch8.


















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.
Added patches/os8/v3d/MACREL-40.5.1M-v1D.patch8.



















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
Added patches/os8/v3d/MACREL-40.5.2M-v1E.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
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
Added patches/os8/v3d/MCPIP-21.21M-v6B.patch8.
















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
Added patches/os8/v3d/MSBAT-31.22.1M-v3B.patch8.


















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.
Added patches/os8/v3d/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
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
********
Added patches/os8/v3d/PAL8-21.22.1M-v10B.patch8.

















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.
Added patches/os8/v3d/PAL8-21.22.2M-v10C.patch8.





















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
Added patches/os8/v3d/PAL8-21.22.3M-v10D.patch8.


















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

Added patches/os8/v3d/PAL8-21.22.4M.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
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
Added patches/os8/v3d/PIP-21.23.1M-v12B.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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

Added patches/os8/v3d/PIP10-21.24.1M-v3B.patch8.




















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.
Added patches/os8/v3d/SABR-21.91.1M-v18B.patch8.


















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.
Added patches/os8/v3d/SET-21.26.1M-v1C.patch8.




















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
Added patches/os8/v3d/SET-21.26.2M-v1D.patch8.
















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
Added patches/os8/v3d/SET-21.26.3M-v1E.patch8.





















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.
Added patches/os8/v3d/TECO-31.20.01O.patch8.













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
Added patches/os8/v3d/TECO-31.20.02O.patch8.


















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
Added patches/os8/v3d/TECO-31.20.03O.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added patches/os8/v3d/TECO-31.20.04O.patch8.




















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
Added patches/os8/v3d/TECO-31.20.05M-v5A.patch8.

















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
Added patches/os8/v3d/TECO-31.20.06M-v5B.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added patches/os8/v3d/TECO-31.20.07M.v5C.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added patches/os8/v3d/TECO-31.20.08M-v5.04.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
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
Added patches/os8/v3d/TECO-31.20.10M-v5.05.patch8.















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
Added patches/os8/v3d/TECO-31.20.11M-v5.06.patch8.














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
Added patches/os8/v3d/TECO-31.20.12M-v5.07.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
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
Added patches/os8/v3d/TECO-31.20.13M-v5.08.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added patches/os8/v3d/patch-list.txt.
































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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
Added pspec/advent.pspec.


















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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


Added pspec/basic-games.pspec.













































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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:
Added pspec/cc8.pspec.































1
2
3
4
5
6
7
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
Added pspec/chekmo.pspec.










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
Added pspec/dcp.pspec.












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
Added pspec/e8.pspec.






















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
Added pspec/focal69.pspec.


















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

Added pspec/kermit-12.pspec.

















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
Added pspec/music.pspec.





































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
Added pspec/uwfocal.pspec.

























































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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

Added pspec/vtedit.pspec.


















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:
Added scripts/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added scripts/include/cusp-copyin.os8.







































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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

Added scripts/misc/advent-tu56.os8.





































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
Added scripts/misc/cc8-tu56.os8.











































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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:
Added scripts/misc/chekmo-tu56.os8.





















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
Added scripts/misc/dcp-tu56.os8.




















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
Added scripts/misc/e8-tu56.os8.































1
2
3
4
5
6
7
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
Added scripts/misc/focal69-tu56.os8.

























1
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
Added scripts/misc/kermit-12-rk05.os8.








































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
Added scripts/misc/music-tu56.os8.


























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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
Added scripts/misc/uwfocal-rk05.os8.















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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


Added scripts/os8-progtest/advent.yml.





























1
2
3
4
5
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']]]
Added scripts/os8-progtest/basic-games.yml.











































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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']]]

Added scripts/os8-progtest/cc8.yml.






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']]]
Added scripts/os8-progtest/chekmo.yml.




1
2
3
4
+
+
+
+
'startup':
    'start': ["R CHEKMO\r", [["W. YOUR MOVE\\? ", 'move']]]
    'move': ["\x03", [["\n\\.$", 'success']]]

Added scripts/os8-progtest/uwfocal.yml.







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']]]
Added scripts/os8/all-tu56.os8.




























































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added scripts/os8/ock/bf2-build.os8.






























































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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
Added scripts/os8/ock/boot-rk05.os8.
















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
Added scripts/os8/ock/cusps-build.os8.











































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added scripts/os8/ock/dist-rk05.os8.








































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added scripts/os8/ock/fiv-build.os8.

























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
Added scripts/os8/ock/patch-rk05.os8.



















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
Added scripts/os8/ock/sys-build.os8.




























































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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
Added scripts/os8/v3d-reset-tc08.os8.












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
Added scripts/os8/v3d/boot-rk05.os8.















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
Added scripts/os8/v3d/dist-rk05.os8.

















































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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
Added scripts/os8/v3d/patch-rk05.os8.











































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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
Added scripts/os8/v3d/src-rk05.os8.













































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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:*.*
Added scripts/os8/v3f/control.os8.











































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
Added scripts/test/build1.os8.










































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
Added scripts/test/build2.os8.






































1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
Added scripts/test/copy.os8.










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/
Added scripts/test/cpto.os8.


















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:


Added scripts/test/error.os8.




























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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

Added scripts/test/ocomp-tu56.os8.





















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
Added scripts/test/ocomp.os8.








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
Added scripts/test/pal8.os8.






































1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
Added scripts/test/patch.os8.









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
Added scripts/test/restart.os8.
















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:
Added scripts/test/resume.os8.
















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:

Added scripts/test/version.os8.
















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
Changes to src/SIMH/PDP8/pdp8_cpu.c.
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580






1581
1582
1583
1584
1585
1586
1587
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.  Using IR for the MB
        // line here for same reason as above.
        set_pidp8i_leds (PC, SteadyMA, IR, IR, LAC, MQ, IF, DF, SC,
                int_req, Pause);

        // 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

1630



1631
1632
1633
1634
1635
1636
1637
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 
else return SCPE_IERR;
    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) */

Changes to src/SIMH/PDP8/pdp8_ct.c.
206
207
208
209
210
211
212
213
214




215
216
217
218
219
220
221
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[] = {
    { MTUF_WLK, 0, "write enabled", "WRITEENABLED", NULL },
    { MTUF_WLK, MTUF_WLK, "write locked", "LOCKED", NULL }, 
    { 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
332
333



334
335
336
337
338
339
340
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 */
                sim_tape_rdrecr (uptr, ct_xb, &t, CT_MAXFR);
            else sim_tape_rdrecf (uptr, ct_xb, &t, CT_MAXFR);
                (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 */
Changes to src/SIMH/PDP8/pdp8_dt.c.
1
2
3

4
5
6
7
8
9
10
1
2

3
4
5
6
7
8
9
10


-
+







/* pdp8_dt.c: PDP-8 DECtape simulator

   Copyright (c) 1993-2017, Robert M Supnik
   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
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
101
102
103


104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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_WLK      (UNIT_V_UF + 0)                 /* write locked */
#define UNIT_V_8FMT     (UNIT_V_UF + 1)                 /* 12b format */
#define UNIT_V_11FMT    (UNIT_V_UF + 2)                 /* 16b format */
#define UNIT_V_8FMT     (UNIT_V_UF + 0)                 /* 12b format */
#define UNIT_V_11FMT    (UNIT_V_UF + 1)                 /* 16b format */
#define UNIT_WLK        (1 << UNIT_V_WLK)
#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 */
#define UNIT_WPRT       (UNIT_WLK | UNIT_RO)            /* write protect */

/* 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
353
354




355
356
357
358
359
360
361
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[] = {
    { UNIT_WLK, 0, "write enabled", "WRITEENABLED", NULL },
    { UNIT_WLK, UNIT_WLK, "write locked", "LOCKED", NULL }, 
    { 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
981

982
983
984
985
986
987
988
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;
            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
1168

1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183

1184
1185
1186
1187
1188
1189
1190
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 CLL */
    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, 7757 */
    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
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
1341

1342
1343

1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
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? */
if (uptr->hwmark && ((uptr->flags & UNIT_RO)== 0))      /* any data? */
    sim_printf ("%s%d: writing buffer to file\n", sim_dname (&dt_dev), u);
    dt_flush (uptr);
    dt_flush (uptr);                                    /* end if hwmark */
    }                                                   /* 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";
}
Changes to src/SIMH/PDP8/pdp8_lp.c.
173
174
175
176
177
178
179

180
181
182
183
184
185
186
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 */

Changes to src/SIMH/PDP8/pdp8_mt.c.
197
198
199
200
201
202
203
204
205




206
207
208
209
210
211
212
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[] = {
    { MTUF_WLK, 0, "write enabled", "WRITEENABLED", &mt_vlock },
    { MTUF_WLK, MTUF_WLK, "write locked", "LOCKED", &mt_vlock }, 
    { 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
278

279
280
281
282
283
284
285
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? */
            detach_unit (uptr);                         /* set offline */
            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 */
            }
Changes to src/SIMH/PDP8/pdp8_pt.c.
42
43
44
45
46
47
48

49
50
51
52
53
54
55
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
126

127
128
129
130
131
132
133
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, NULL, NULL,
    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
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[] = {
Changes to src/SIMH/PDP8/pdp8_rf.c.
129
130
131
132
133
134
135
136

137
138
139
140
141
142
143
144




145
146
147


148
149
150
151
152
153
154
129
130
131
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 (orphan)
   pcell_unit   photocell timing unit
   rf_reg       RF register list
*/

DIB rf_dib = { DEV_RF, 5, { &rf60, &rf61, &rf62, NULL, &rf64 } };

UNIT rf_unit = {
    UDATA (&rf_svc, UNIT_FIX+UNIT_ATTABLE+
           UNIT_BUFABLE+UNIT_MUSTBUF, RF_DKSIZE)
UNIT rf_units[] = {
    { UDATA (&rf_svc, UNIT_FIX+UNIT_ATTABLE+
             UNIT_BUFABLE+UNIT_MUSTBUF, RF_DKSIZE) },
    { UDATA (&pcell_svc, UNIT_DIS, 0) }
    };

UNIT pcell_unit = { UDATA (&pcell_svc, 0, 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
177
178


179
180
181
182
183
184
185
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_unit, rf_reg, rf_mod,
    1, 8, 20, 1, 8, 12,
    "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
    };

Changes to src/SIMH/PDP8/pdp8_rk.c.
47
48
49
50
51
52
53
54

55
56

57
58
59
60
61
62
63
64
65
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_HWLK     (UNIT_V_UF + 0)                 /* hwre write lock */
#define UNIT_V_SWLK     (UNIT_V_UF + 0)                 /* swre write lock */
#define UNIT_V_SWLK     (UNIT_V_UF + 1)                 /* swre write lock */
#define UNIT_HWLK       (1 << UNIT_V_HWLK)
#define UNIT_HWLK       UNIT_WPRT
#define UNIT_SWLK       (1 << UNIT_V_SWLK)
#define UNIT_WPRT       (UNIT_HWLK|UNIT_SWLK|UNIT_RO)   /* write protect */

/* Parameters in the unit descriptor */

#define CYL             u3                              /* current cylinder */
#define FUNC            u4                              /* function */

/* Status register */
177
178
179
180
181
182
183
184
185




186
187
188
189
190
191
192
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[] = {
    { UNIT_HWLK, 0, "write enabled", "WRITEENABLED", NULL },
    { UNIT_HWLK, UNIT_HWLK, "write locked", "LOCKED", NULL },
    { 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
309

310
311
312
313
314
315
316
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_WPRT)) {
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
365

366
367
368
369
370
371
372
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_WPRT)) {
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 */
Changes to src/SIMH/PDP8/pdp8_rl.c.
60
61
62
63
64
65
66
67
68
69
70



71
72
73
74
75
76
77
78
79
80
81
82
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_WLK      (UNIT_V_UF + 0)                 /* write lock */
#define UNIT_V_RL02     (UNIT_V_UF + 1)                 /* RL01 vs RL02 */
#define UNIT_V_AUTO     (UNIT_V_UF + 2)                 /* autosize enable */
#define UNIT_V_DUMMY    (UNIT_V_UF + 3)                 /* dummy flag */
#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_WLK        (1u << UNIT_V_WLK)
#define UNIT_RL02       (1u << UNIT_V_RL02)
#define UNIT_AUTO       (1u << UNIT_V_AUTO)
#define UNIT_WPRT       (UNIT_WLK | UNIT_RO)            /* write protect */

/* 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
234
235




236
237
238
239
240
241
242
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[] = {
    { UNIT_WLK, 0, "write enabled", "WRITEENABLED", NULL },
    { UNIT_WLK, UNIT_WLK, "write locked", "LOCKED", NULL },
    { 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 },
Changes to src/SIMH/PDP8/pdp8_rx.c.
66
67
68
69
70
71
72
73
74
75


76
77
78
79
80
81
82
83
84
85
86
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_WLK      (UNIT_V_UF + 0)                 /* write locked */
#define UNIT_V_DEN      (UNIT_V_UF + 1)                 /* double density */
#define UNIT_V_AUTO     (UNIT_V_UF + 2)                 /* autosize */
#define UNIT_V_DEN      (UNIT_V_UF + 0)                 /* double density */
#define UNIT_V_AUTO     (UNIT_V_UF + 1)                 /* autosize */
#define UNIT_WLK        (1u << UNIT_V_WLK)
#define UNIT_DEN        (1u << UNIT_V_DEN)
#define UNIT_AUTO       (1u << UNIT_V_AUTO)
#define UNIT_WPRT       (UNIT_WLK | UNIT_RO)            /* write protect */

#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
196
197




198
199
200
201
202
203
204
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[] = {
    { UNIT_WLK, 0, "write enabled", "WRITEENABLED", NULL },
    { UNIT_WLK, UNIT_WLK, "write locked", "LOCKED", NULL },
    { 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 },
Changes to src/SIMH/PDP8/pdp8_sys.c.
111
112
113
114
115
116
117
118

119
120
121
122
123
124
125
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[] = {
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

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
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 (rubout)                                         /* toggle set? */
        rubout = 0;                                     /* clr, skip */
    else if (c == 0377)                                 /* rubout? */
        if (c == 0377)                                  /* ending rubout? */
            rubout = 0;                                 /* clr, skip */
        else
            continue;                                   /* skip charactder */
        }
    if (c == 0377)                                      /* rubout? */
        rubout = 1;                                     /* set, skip */
    else
    else if (c > 0200)                                  /* channel 8 set? */
        *newf = (c & 070) << 9;                         /* change field */
    else return c;                                      /* otherwise ok */
        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_stat sim_load_bin (FILE *fi, t_bool do_load)
{
int32 hi, lo, wd, csum, t;
uint32 field, newf, origin;
uint32 field, newf, origin, words;
int32 sections_read = 0;

for (;;) {
    csum = origin = field = newf = 0;                   /* init */
    csum = origin = field = newf = words = 0;           /* init */
    do {                                                /* skip leader */
        if ((hi = sim_bin_getc (fi, &newf)) == EOF) {
            if (sections_read != 0) {
                sim_printf ("%d sections sucessfully read\n\r", sections_read);
                return SCPE_OK;
            if (sections_read != 0)
                return sim_messagef (SCPE_OK, "%d section%s sucessfully read\n",
                                              sections_read, (sections_read != 1) ? "s" : "");
                } 
            else
                return SCPE_FMT;
                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 */
            return SCPE_FMT;
        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 */
            return SCPE_FMT;
        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_printf ("%d sections sucessfully read\n\r", sections_read);
                return SCPE_CSUM;
                    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')))        /* Load all sections? */
            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;
                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) || (flag != 0))
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);                     /* no, BIN */
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 */
Changes to src/SIMH/PDP8/pdp8_td.c.
78
79
80
81
82
83
84
85
86
87


88
89
90
91
92
93
94
95
96
97
98
99
100
101
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_WLK      (UNIT_V_UF + 0)                 /* write locked */
#define UNIT_V_8FMT     (UNIT_V_UF + 1)                 /* 12b format */
#define UNIT_V_11FMT    (UNIT_V_UF + 2)                 /* 16b format */
#define UNIT_V_8FMT     (UNIT_V_UF + 0)                 /* 12b format */
#define UNIT_V_11FMT    (UNIT_V_UF + 1)                 /* 16b format */
#define UNIT_WLK        (1 << UNIT_V_WLK)
#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 UNIT_WPRT       (UNIT_WLK | UNIT_RO)            /* write protect */

/* 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
255
256




257
258
259
260
261
262
263
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[] = {
    { UNIT_WLK, 0, "write enabled", "WRITEENABLED", NULL },
    { UNIT_WLK, UNIT_WLK, "write locked", "LOCKED", NULL }, 
    { 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
415

416
417
418
419
420
421
422
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;
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
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
909

910
911
912
913
914
915
916
917
918
919
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? */
if (uptr->hwmark && ((uptr->flags & UNIT_RO)== 0))      /* any data? */
    sim_printf ("%s%d: writing buffer to file\n", sim_dname (&td_dev), u);
    td_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 */
uptr->pos = uptr->STATE = 0;
sim_cancel (uptr);                                      /* no more pulses */
Changes to src/SIMH/PDP8/pdp8_tsc.c.
19
20
21
22
23
24
25
26
27


28
29

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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 PDP-8/E simulator

   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
        PDP-8/E Simulator Source Code

   undocumented device.
        Copyright ) 2001-2003 Bernhard Baehr

        TSC8iots.c - IOTs for the TSC8-75 Board plugin

        This program 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 2 of the License, or
        (at your option) any later version.

        This program 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 this program; if not, write to the Free Software
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

   tsc          TSC8-75 option board
*/

#include "pdp8_defs.h"

extern int32 int_req;
Changes to src/SIMH/PDP8/pdp8_tt.c.
51
52
53
54
55
56
57

58
59
60
61
62
63
64
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
84
85
86
87









88
89
90
91
92
93
94
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[] = {
    { TT_MODE, TT_MODE_KSR, "KSR", "KSR", &tty_set_mode },
    { TT_MODE, TT_MODE_7B,  "7b",  "7B",  &tty_set_mode },
    { TT_MODE, TT_MODE_8B,  "8b",  "8B",  &tty_set_mode },
    { TT_MODE, TT_MODE_7P,  "7b",  NULL,  NULL },
    { 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
126
127
128
129









130
131
132
133
134
135
136
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[] = {
    { TT_MODE, TT_MODE_KSR, "KSR", "KSR", &tty_set_mode },
    { TT_MODE, TT_MODE_7B,  "7b",  "7B",  &tty_set_mode },
    { TT_MODE, TT_MODE_8B,  "8b",  "8B",  &tty_set_mode },
    { TT_MODE, TT_MODE_7P,  "7p",  "7P",  &tty_set_mode },
    { 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









288
289


290
291
292
293
294
295
296
297
298
299
300
301
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_MODE) | val;
tto_unit.flags = (tto_unit.flags & ~TT_MODE) | val;
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";
}
Changes to src/SIMH/scp.c.
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
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 <direct.h>
#include <io.h>
#include <fcntl.h>
#else
#include <unistd.h>
#endif
#include <sys/stat.h>
#include <setjmp.h>

#if defined(HAVE_DLOPEN)                                /* Dynamic Readline support */
#include <dlfcn.h>
#endif

#ifdef PIDP8I
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
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 */
#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                                                 \
        (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
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
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 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;

#define SIM_DBG_EVENT_NEG   0x80000000      /* negative event dispatch activities */
#define SIM_DBG_EVENT       0x02000000      /* event dispatch activities */
#define SIM_DBG_ACTIVATE    0x04000000      /* queue insertion activities */
#define SIM_DBG_AIO_QUEUE   0x08000000      /* asynch event queue activities */
#define SIM_DBG_EXP_STACK   0x10000000      /* expression stack activities */
#define SIM_DBG_EXP_EVAL    0x20000000      /* expression evaluation activities */
#define SIM_DBG_BRK_ACTION  0x40000000      /* action activities */
#define SIM_DBG_DO          0x80000000      /* do 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";
return "SCP Event and Internal Command Processing and Testing";
}

static UNIT scp_unit;
static UNIT scp_test_units[4];

DEVICE sim_scp_dev = {
    "SCP-PROCESS", &scp_unit, NULL, NULL, 
    1, 0, 0, 0, 0, 0, 
    "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
423

424
425
426
427
428
429
430
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 instructions\n", sim_uname(q), q->a_event_time);
        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
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
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 instructions\n", sim_uname(uptr), event_time);
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 instructions\n", sim_uname(uptr), event_time);
    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 */
   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
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
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
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_library_unit_tests (void);
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 */
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
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
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_show_message = 1;                      /* the message display 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";
}

#define FLUSH_INTERVAL 30*1000000           /* Flush I/O buffers every 30 seconds */
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 "Flush facility";
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, NULL, NULL, 
    "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
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
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"},
        {{"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


828

829
830
831
832
833
834
835
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_help[] =
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
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
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 command\n"
      "                         interpreted as an address\n"
      "++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"
      "++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
1026
1027


1028
1029
1030

1031
1032
1033
1034
1035
1036
1037
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 instructions given by its argument.  If no argument is\n"
      " supplied, one instruction is executed.\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 instructions.\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
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
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
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
1275



1276
1277
1278
1279
1280
1281
1282
1283
1284

1285
1286
1287
1288
1289
1290
1291
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"
      " 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 instructions which have been executed prior to the debug event.\n\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
1328
1329


1330
1331
1332
1333

1334
1335
1336
1337
1338

1339
1340
1341
1342
1343
1344
1345
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 instructions per second\n"
      "+SET THROTTLE xK             execute x thousand instructions per second\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"
      "++++++++instructions\n\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"
      " instructions to actually calibrate the desired execution rate relative\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
1360

1361
1362
1363
1364
1365
1366
1367
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 instructions\n\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
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
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"
       /***************** 80 character line width template *************************/
      "++++++++                     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 asynchronouse I/O state\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"
#if defined(USE_SIM_VIDEO)
      "+sh{ow} video                show video capabilities\n"
#endif
      "+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
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
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
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
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
1987

1988
1989
1990
1991
1992
1993
1994


1995
1996
1997
1998
1999
2000
2001
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 instructions\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
2016

2017
2018
2019
2020
2021
2022
2023
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 instructions.\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
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
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.\n\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_PCREPOSIX_H)
#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"
#elif defined (HAVE_REGEX_H)
      " The syntax of the regular expressions available are those supported by\n"
      " your local system's Regular Expression library using the Extended POSIX\n"
      " Regular Expressiona\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 instructions.\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
2114

2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127


2128
2129
2130
2131
2132
2133
2134
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 instructions which should be executed before\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
2208
2209
2210
2211
2212
2213
2214
2215
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
2259

2260



2261
2262
2263
2264
2265
2266
2267
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} {NOT} \"<string1>\"|EnVarName1 <compare-op> \"<string2>|EnvVarName2\"\n\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
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
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 {NOT} \"<filespec1>\" == \"<filespec2>\" \n\n"
      "++-F{W} {NOT} \"<filespec1>\" == \"<filespec2>\" \n\n"
      " Specifies a true (false {NOT}) condition if the indicated files\n"
      " have the same contents.\n\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\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"
      "++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";
      " 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
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",       &copy_cmd,      0,          HLP_COPY,       NULL, NULL },
    { "CP",         &copy_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
2385
2386

2387






2388
2389
2390
2391
2392
2393
2394
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 },
#if defined(USE_SIM_VIDEO)
    { "SCREENSHOT", &screenshot_cmd,0,          HLP_SCREENSHOT, NULL, NULL },
    { "TAR",        &tar_cmd,       0,          HLP_TAR,        NULL, NULL },
#endif
    { "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
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
2466
2467
2468
2469
2470
2471
2472



2473
2474
2475
2476
2477
2478
2479
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",       &eth_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 },
#if defined(USE_SIM_VIDEO)
    { "VIDEO",          &vid_show,                  0, HLP_SHOW_VIDEO },
#endif
    { "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,                   0, HLP_SHOW_ON },
    { "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
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
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_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 0;
            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 0;
            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 */
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 */
if (sim_vm_init != NULL)                                /* call once only */
    (*sim_vm_init)();
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");
    read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin);
    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);

if ((stat = sim_ttinit ()) != SCPE_OK) {
    fprintf (stderr, "Fatal terminal initialization error\n%s\n",
        sim_error_text (stat));
    read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin);
    return EXIT_FAILURE;
    }
if ((sim_eval = (t_value *) calloc (sim_emax, sizeof (t_value))) == NULL) {
    fprintf (stderr, "Unable to allocate examine buffer\n");
    read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin);
    return EXIT_FAILURE;
    };
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\n%s\n",
        sim_error_text (stat));
    read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin);
    return EXIT_FAILURE;
    }
if ((stat = sim_brk_init ()) != SCPE_OK) {
    fprintf (stderr, "Fatal breakpoint table initialization error\n%s\n",
        sim_error_text (stat));
    read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin);
    return EXIT_FAILURE;
    }
signal (SIGINT, int_handler);
if (!sim_quiet) {
    printf ("\n");
    show_version (stdout, NULL, NULL, 0, NULL);
    }
show_version (stdnul, NULL, NULL, 1, NULL);             /* Quietly set SIM_OSTYPE */
#if defined (HAVE_PCREPOSIX_H)
setenv ("SIM_REGEX_TYPE", "PCREPOSIX", 1);              /* Publish regex type */
#elif defined (HAVE_REGEX_H)
setenv ("SIM_REGEX_TYPE", "REGEX", 1);                  /* Publish regex type */
#endif
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") + 1) {
    sprintf(nbuf, "\"%s%s%ssimh.ini\"", cptr2 ? cptr2 : "", cptr, strchr (cptr, '/') ? "/" : "\\");
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
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
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 (sim_switches & SWMASK ('T'))                       /* Command Line -T switch */
    stat = sim_library_unit_tests ();                   /* run library unit tests */

if (SCPE_BARE_STATUS(stat) != SCPE_EXIT)
    process_stdin_commands (SCPE_BARE_STATUS(stat), argv);
    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 ();                                           /* close video */
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_stat process_stdin_commands (t_stat stat, char *argv[], t_bool do_called)
{
char cbuf[4*CBUFSIZE], gbuf[CBUFSIZE];
CONST char *cptr;
CONST char *cptr = NULL;
t_stat stat_nomessage;
CTAB *cmdp;
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 (cptr = build_pidp8i_scp_cmd (cbuf, sizeof (cbuf)))
    if (sim_do_ocptr[sim_do_depth] = cptr = build_pidp8i_scp_cmd (cbuf, sizeof (cbuf)))
        printf ("Running '%s'...\n", cptr);
    else
#endif
    if ((cptr = sim_brk_getact (cbuf, sizeof(cbuf)))) { /* pending action? */
    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;
        }
    cptr = get_glyph_cmd (cptr, gbuf);                  /* get command glyph */
    sim_switches = 0;                                   /* init switches */
    if ((cmdp = find_cmd (gbuf)))                       /* lookup command */
    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

2895

2896
2897
2898
2899
2900
2901
2902
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);
    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
2961

2962
2963
2964
2965
2966

2967
2968

2969
2970






2971
2972
2973
2974
2975
2976
2977
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\n", namebuf, rptr->width, rptr->desc ? rptr->desc : "");
            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\n", dptr->name, namebuf, rptr->width, rptr->desc ? rptr->desc : "");
            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\n", (int)strlen(dptr->name), "", namebuf, rptr->width, rptr->desc ? rptr->desc : "");
            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
3033

3034
3035
3036
3037
3038
3039
3040
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 ((dptr->numunits != 1) && !(mptr->mask & MTAB_XTD))
        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
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
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) && (dptr->numunits != 1)) {
if ((dptr->modifiers) && (dptr->units)) {   /* handle unit specific modifiers */
    if (dptr->units->flags & UNIT_DISABLE) {
        fprint_header (st, &found, header);
        sprintf (buf, "set %sn ENABLE", sim_dname (dptr));
        fprintf (st,  "%-30s\tEnables unit %sn\n", buf, sim_dname (dptr));
        sprintf (buf, "set %sn DISABLE", sim_dname (dptr));
        fprintf (st,  "%-30s\tDisables unit %sn\n", buf, sim_dname (dptr));
        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 %sn DEBUG", sim_dname (dptr));
        fprintf (st,  "%-30s\tEnables debugging for device unit %sn\n", buf, sim_dname (dptr));
        sprintf (buf, "set %sn NODEBUG", sim_dname (dptr));
        fprintf (st,  "%-30s\tDisables debugging for device unit %sn\n", buf, sim_dname (dptr));
        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 %sn DEBUG=", sim_dname (dptr));
            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 %sn\n", buf, sim_dname (dptr));
            fprintf (st, "set %sn NODEBUG=", sim_dname (dptr));
            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 %sn\n", buf, sim_dname (dptr));
            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%s", sim_dname (dptr), (dptr->numunits > 1) ? "n" : "0", mptr->mstring, (strchr(mptr->mstring, '=')) ? "" : (MODMASK(mptr,MTAB_VALR) ? "=val" : (MODMASK(mptr,MTAB_VALO) ? "{=val}": "")));
            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 ((dptr->numunits != 1) && !(mptr->mask & MTAB_XTD))
        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" : "");
        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) && (dptr->numunits != 1)) {
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%s", sim_dname (dptr), (dptr->numunits > 1) ? "n" : "0", mptr->pstring, MODMASK(mptr,MTAB_SHP) ? "=arg" : "");
        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
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
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)
        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)
        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
3326

3327
3328
3329
3330
3331
3332
3333
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)
                        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
3379

3380
3381
3382
3383
3384
3385
3386
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)
                            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


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
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_DISABLE)
        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)
        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)
    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
3452

3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
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 SCPE_ARG;
    return sim_messagef (SCPE_ARG, "Missing screen shot filename\n");
#if defined (USE_SIM_VIDEO)
return vid_screenshot (cptr);
#else
sim_printf ("No video device\n");
return SCPE_UNK|SCPE_NOMESSAGE;
#endif
}

/* Echo command */

t_stat echo_cmd (int32 flag, CONST char *cptr)
{
sim_printf ("%s\n", cptr);
3492
3493
3494
3495
3496
3497
3498
3499

3500
3501
3502
3503

3504
3505
3506
3507
3508
3509
3510
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_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");
    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
3540

3541
3542

3543
3544
3545
3546
3547
3548
3549
3550

3551
3552
3553
3554
3555
3556
3557
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[CBUFSIZE];
static char cbuf[4*CBUFSIZE];

sprintf (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]);
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;
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

3593

3594
3595
3596

3597
3598
3599
3600
3601
3602
3603
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) &&
if ((fpin = fopen (do_arg[0], "r")) == NULL) {          /* file failed to open? */
    ((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 = fopen (cbuf, "r")) == NULL) {           /* failed a second time? */
    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
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
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], c, 
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
3755

3756
3757
3758
3759
3760
3761
3762
3763
3764
3765

3766

3767
3768
3769
3770
3771
3772
3773
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) &&
        (stat != SCPE_OK)) {
        (stat != SCPE_STEP)) {
        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 */
    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
4176
4177
4178
4179
4180

4181
4182
4183
4184
4185
4186
4187
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 instr_off = 0;
size_t outstr_off = 0;

sim_exp_argv = do_arg;
clock_gettime(CLOCK_REALTIME, &cmd_time);
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
4232

4233
4234
4235
4236
4237
4238
4239
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 ("fpnx", *ip)); i++, 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

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
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 = fopen (filename1, "rb");
    f2 = fopen (filename2, "rb");
    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)) ;
        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
4443

4444
4445
4446
4447
4448

4449
4450
4451
4452
4453
4454
4455
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;
uint32 idx = 0;
t_stat r;
t_bool Not = FALSE;
t_bool Exist = FALSE;
t_bool result;
t_addr addr;
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
4534

4535
4536
4537
4538
4539
4540
4541
4542

4543
4544
4545
4546
4547
4548
4549
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 = fopen (gbuf, "r");
        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 = fopen (without_quotes, "r");
                    f = sim_fopen (without_quotes, "r");
                    free (without_quotes);
                    }
                }
            }
        if (f)
            fclose (f);
        result = (f != NULL);
4568
4569
4570
4571
4572
4573
4574

4575

4576
4577
4578
4579
4580
4581
4582
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
            else idx = 0;                                   /* not array */
                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
4744

4745
4746

4747
4748
4749
4750
4751
4752
4753
4754
4755

4756
4757

4758
4759
4760
4761
4762
4763
4764
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, 10000000, &r);
        delay = (uint32)get_uint (&gbuf[6], 10, 2000000000, &r);
        if (r != SCPE_OK)
            return sim_messagef (SCPE_ARG, "Invalid Delay Value\n");
            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, 10000000, &r);
        after = (uint32)get_uint (&gbuf[6], 10, 2000000000, &r);
        if (r != SCPE_OK)
            return sim_messagef (SCPE_ARG, "Invalid After Value\n");
            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


4913


4914
4915
4916
4917
4918
4919







4920
4921
4922
4923
4924
4925
4926
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>")))
if (NULL == sim_gotofile) return SCPE_UNK;              /* only valid inside of do_cmd */
    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
4955

4956
4957
4958
4959
4960
4961
4962
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 SCPE_UNK;                                        /* only valid inside of do_cmd */
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
4978

4979
4980
4981
4982
4983

4984



4985
4986
4987
4988
4989
4990
4991
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[CBUFSIZE], gbuf[CBUFSIZE];
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], ' ')) ? "\"" : "", 
sprintf(cbuf, "%s %s", sim_do_filename[sim_do_depth], cptr);
                                            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
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
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)) {
                        get_glyph_quoted (svptr, gbuf, ',');
                        if ((cvptr = strchr (gbuf, '=')))
                        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 (mptr->mask & MTAB_VAL) {     /* take a value? */
//                    if (!cvptr) return SCPE_MISVAL;   /* none? error */
//                    r = dep_reg (0, cvptr, (REG *) mptr->desc, 0);
//                    if (r != SCPE_OK) return r;
//                    }
                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
5425

5426
5427
5428
5429
5430
5431
5432
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 SCPE_NOFNC;                          /* can't do it */
            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
5447

5448
5449
5450
5451
5452
5453
5454
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 SCPE_NOFNC;
        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
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
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
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 SCPE_NXUN;
        return sim_messagef (SCPE_NXUN, "Non-existent unit: %s\n", gbuf);
    if (uptr->flags & UNIT_DIS)                         /* disabled? */
        return SCPE_UDIS;
        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->mask != 0; mptr++) {
        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 SCPE_NXDEV;                          /* no match */
            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))
 //           ||
 //           ((mptr->mask & MTAB_VAL) &&                 /* named value? */
 //           mptr->mstring &&
 //           (MATCH_CMD (gbuf, mptr->mstring) == 0)))
            )) {
            if (cvptr && !(mptr->mask & MTAB_SHP))
                return SCPE_ARG;
            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 {
        else if (!dptr->modifiers)                      /* no modifiers? */
            return SCPE_NOPARAM;
        else
            return SCPE_NXPAR;
            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 = 0;
int32 toks = -1;

fprintf (st, "%s", sim_dname (dptr));                   /* print dev name */
fprintf (st, "%s", _sim_dname (dptr));                   /* print dev name */
if ((flag == 2) && dptr->description) {
    fprintf (st, "\t%s\n", dptr->description(dptr));
    fprintf (st, "%s\n", dptr->description(dptr));
    fprintf (st, "%s", _sim_dname_space ());
    }
else {
    if ((sim_switches & SWMASK ('D')) && dptr->description)
        fprintf (st, "\t%s\n", dptr->description(dptr));
    }
    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, "\tdisabled\n");
    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
5700

5701


5702
5703
5704
5705
5706
5707

5708
5709
5710
5711
5712






5713
5714
5715
5716
5717
5718
5719
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, (*tokens > 0) ? ", " : "\t");
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 u = (int32)(uptr - dptr->units);
int32 toks = 0;
int32 toks = -1;

if (flag > 1)
    fprintf (st, "  %s%d", sim_dname (dptr), u);
else if (flag < 0)
    fprintf (st, "%s%d", sim_dname (dptr), u);
    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
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
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) + 8];
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))
if ((psize < (kval * 10)) &&
    (0 != (psize % kval))) {
    remfrac = 0.0;
    scale = "";
    }
else if (psize < (mval * 10)) {
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
5886

5887
5888
5889
5890
5891
5892
5893
5894


5895
5896
5897
5898
5899
5900
5901
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_PCREPOSIX_H)
#if defined (HAVE_PCRE_H)
    fprintf (st, "\n        PCRE RegEx (Version %s) support for EXPECT commands", pcre_version());
#elif defined (HAVE_REGEX_H)
    fprintf (st, "\n        RegEx support for EXPECT commands");
#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
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



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
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", flag ? "\n        " : "        ", S_xstr(SIM_GIT_COMMIT_ID));
setenv ("SIM_GIT_COMMIT_ID", S_xstr(SIM_GIT_COMMIT_ID), 1);
    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
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
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;
int32 accum;
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 instructios/sec\n",
             sim_name, sim_time, sim_fmt_numeric (sim_timer_inst_per_sec ()));
    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 instructions/sec\n",
             sim_name, sim_time, sim_fmt_numeric (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);
    accum = 0;
    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(((accum + uptr->time) / sim_timer_inst_per_sec ()) + (uptr->usecs_remaining / 1000000.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", accum + uptr->time, 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", accum + uptr->time, 
            fprintf (st, " at %d%s%s%s%s\n", _sim_activate_queue_time (uptr) - 1, 
                                            (*tim) ? " (" : "", tim, (*tim) ? ")" : "",
                                            (uptr->flags & UNIT_IDLE) ? " (Idle capable)" : "");
        accum = accum + uptr->time;
        }
    }
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
6096

6097
6098
6099
6100
6101
6102
6103
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 instructions\n", sim_asynch_inst_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
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
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 */
/* 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)
for (lvl=sim_do_depth; lvl >= 0; --lvl) {
    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");
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
6271
6272
6273
6274
6275

6276
6277
6278
6279
6280
6281
6282

6283
6284
6285
6286
6287
6288
6289
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;
//t_value val;

if (mptr->disp)
    r = mptr->disp (st, uptr, mptr->match, (CONST void *)(cptr? cptr: mptr->desc));
//else if ((mptr->mask & MTAB_XTD) && (mptr->mask & MTAB_VAL)) {
else
//    REG *rptr = (REG *) mptr->desc;
//    fprintf (st, "%s=", mptr->pstring);
//    val = get_rval (rptr, 0);
//    fprint_val (st, val, rptr->radix, rptr->width,
//        rptr->flags & REG_FMT);
//    }
else fputs (mptr->pstring, st);
    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
6332

6333
6334
6335
6336
6337
6338
6339
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 (chdir(gbuf) != 0)
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
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
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] == '\\'))
        WildName[strlen (WildName) - 1] = '\0';
        strlcat (WildName, ".", sizeof (WildName));
    }
if ((!stat (WildName, &filestat)) && (filestat.st_mode & S_IFDIR))
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)
{
TYPE_CTX *ctx = (TYPE_CTX *)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 (fgets (lbuf, sizeof(lbuf)-1, file))
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 (fgets (lbuf, sizeof(lbuf)-1, file))
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
6528

6529
6530
6531
6532
6533
6534
6535
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_ARG, "No such file or directory: %s\n", cptr);
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
6555

6556
6557
6558
6559
6560
6561
6562
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 ((!stat (dname, &deststat)) && (deststat.st_mode & S_IFDIR)) {
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
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 (&copy_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, &copy_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

6754

6755
6756

6757
6758
6759
6760


6761

6762
6763
6764

6765
6766
6767
6768
6769
6770
6771
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')) {
    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)
        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


6834
6835
6836
















6837


















6838
6839
6840
6841
6842
6843
6844
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;
}
if (sim_dflt_dev)   /* Make sure that SCP debug options are available */
    sim_add_debug_flags (sim_dflt_dev, scp_debug);
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
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
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_dname (dptr));
        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\n", sim_dname (dptr));
        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_dname (dptr));
                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_dname (dptr));
                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_dname (dptr));
    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
7141

7142
7143
7144
7145

7146
7147
7148
7149
7150
7151
7152
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\n", sim_dname (dptr));
        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_dname (dptr), strerror (errno));
            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

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
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)
    return SCPE_OPENERR;
    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
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
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
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
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;
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
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
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
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 = calloc (SRBSIZ, sz)) == NULL) {
            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 */
                    free (mbuf);
                    r = SCPE_IOERR;
                    goto Cleanup_Return;
                    }
                if (blkcnt < 0)                         /* compressed? */
                    limit = -blkcnt;
                else
                else limit = (int32)sim_fread (mbuf, sz, blkcnt, rfile);
                    limit = (int32)sim_fread (mbuf, sz, blkcnt, rfile);
                if (limit <= 0) {                       /* invalid or err? */
                    free (mbuf);
                    r = SCPE_IOERR;
                    goto Cleanup_Return;
                    }
                for (j = 0; j < limit; j++, k = k + (dptr->aincr)) {
                    if (blkcnt < 0)                     /* compressed? */
                        val = 0;
                    else 
                    else SZ_LOAD (sz, val, mbuf, j);    /* saved value */
                        SZ_LOAD (sz, val, mbuf, j);     /* saved value */
                    r = dptr->deposit (val, k, uptr, SIM_SW_REST);
                    if (r != SCPE_OK) {
                        free (mbuf);
                        goto Cleanup_Return;
                        }
                    }                                   /* end for j */
                }                                       /* end for k */
            free (mbuf);                                /* dealloc buffer */
            }                                           /* 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 {
            else if (us < rptr->depth)                  /* in range? */
                put_rval (rptr, us, val);
                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
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
7820

7821
7822
7823
7824
7825
7826
7827
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, FLUSH_INTERVAL);
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
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
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 pcv, orig_pcv;
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;

    orig_pcv = get_rval (sim_PC, 0);                    /* get current PC value */
    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? */
                pcv = sim_vm_parse_addr (sim_dflt_dev, gbuf, &tptr);
            else pcv = strtotv (gbuf, &tptr, sim_PC->radix);/* parse PC */
                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? */
                (pcv > width_mask[sim_PC->width]))
                (new_pcv > width_mask[sim_PC->width]))
                return SCPE_ARG;
            put_rval (sim_PC, 0, pcv);                  /* Save in PC */
            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 (sim_PC, 0, orig_pcv);                 /* restore original PC */
        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
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

7984

7985
7986
7987
7988
7989
7990
7991
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) &&
            if (sim_fseek (uptr->fileref, uptr->pos, SEEK_SET))
                (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
8010

8011
8012
8013
8014

8015
8016

8017
8018
8019
8020
8021
8022
8023
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 */
if (sim_step)                                           /* set step timer */
    if (sim_switches & SWMASK ('T'))                    /* stepping for elapsed time? */
        sim_activate_after (&sim_step_unit, (uint32)sim_step);/* wall clock based step */
    else
        sim_activate (&sim_step_unit, sim_step);        /* instruction based step */
    sim_sched_step ();
    }
sim_activate_after (&sim_flush_unit, FLUSH_INTERVAL);   /* Enable periodic buffer flushing */
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
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
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_activate (&sim_step_unit, sim_step);
        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, SIG_DFL);                               /* cancel WRU */
signal (SIGHUP, sigterm_received ? SIG_IGN : SIG_DFL);  /* cancel WRU */
#endif
signal (SIGTERM, SIG_DFL);                              /* cancel WRU */
signal (SIGTERM, sigterm_received ? SIG_IGN : SIG_DFL); /* cancel WRU */
sim_flush_buffered_files();
sim_cancel (&sim_flush_unit);                           /* cancel flush timer */
sim_cancel (&sim_step_unit);                            /* cancel step 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
8121

8122
8123
8124
8125

8126
8127
8128
8129
8130
8131
8132
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;

sim_interval = 0;                                       /* reset queue */
/* reset queue */
sim_time = sim_rtime = 0;
noqueue_time = 0;                                       /* 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
8182

8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201








8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216










8217
8218
8219
8220
8221
8222
8223
8224

8225
8226
8227
8228
8229
8230
8231
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)
        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
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
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
8637

8638
8639
8640
8641





8642
8643
8644
8645
8646
8647
8648

8649
8650
8651
8652
8653
8654
8655
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 (REG *rptr, uint32 idx, t_value val)
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 (rptr == sim_PC)
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
8673

8674
8675
8676
8677
8678
8679
8680
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));
    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
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
8846




8847
8848
8849
8850
8851
8852
8853
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 SCPE_RO;
    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
8919

8920
8921
8922
8923
8924
8925
8926
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) {
    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
9009

9010


9011
9012
9013
9014
9015
9016
9017
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? */
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
9097
9098

9099

9100

9101
9102
9103
9104
9105
9106
9107
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++;
    }
*optr = 0;
if (mchar && (*iptr == mchar))                          /* skip terminator */
if (mchar && (*iptr == mchar))              /* skip input terminator */
    iptr++;
*optr = 0;                                  /* terminate result string */
while (sim_isspace (*iptr))                             /* absorb spaces */
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
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
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);
}

/* 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;
}

/* 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 */
}

/* 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










9359

9360
9361
9362
9363
9364
9365
9366
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)
    if ((*tptr != 0) || (val > max))
        *status = SCPE_ARG;
    }
return val;
}

/* get_range            range specification

10195
10196
10197
10198
10199
10200
10201
10202

10203
10204
10205
10206
10207
10208
10209
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;
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
10325

10326
10327
10328
10329
10330
10331
10332
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])
            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



10758

10759
10760
10761
10762
10763
10764



















10765
10766
10767
10768
10769
10770
10771





10772
10773
10774
10775
10776
10777
10778
10779
10780
10781
10782
10783
10784
10785
10786







10787
10788
10789
10790
10791
10792
10793
10794








10795
10796
10797
10798

10799
10800
10801
10802
10803
10804
10805
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)
        sim_interval += sim_clock_queue->time;
    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)   && 
    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 <= 0) && 
             ((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
10974
10975
10976

10977
10978
10979
10980
10981
10982
10983
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;
UPDATE_SIM_TIME;                                        /* update sim time */
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

11000

11001
11002
11003
11004
11005
11006
11007
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
else sim_interval = noqueue_time = NOQUEUE_WAIT;
    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
11033

11034
11035
11036
11037
11038
11039
11040
11041
11042
11043
11044
11045
11046
11047

11048
11049
11050









11051
11052
11053
11054
11055
11056
11057
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_time (UNIT *uptr)
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 + (int32)((uptr->usecs_remaining * sim_timer_inst_per_sec ()) / 1000000.0);
        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


11503

11504
11505

11506
11507
11508
11509
11510

11511
11512
11513
11514
11515
11516
11517
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] == sim_time)                /* already taken?  */
    if (bp->time_fired[spc] == s_gtime)                 /* already taken?  */
        return 0;
    bp->time_fired[spc] = sim_time;                     /* remember match time */
    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 */
    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
11739

11740
11741

11742
11743
11744
11745
11746
11747
11748
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, 100000000, &r);
    after = (uint32)get_uint (&gbuf[10], 10, 2000000000, &r);
    if (r != SCPE_OK)
        return sim_messagef (SCPE_ARG, "Invalid Halt After Value\n");
        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
11801

11802
11803
11804
11805
11806
11807
11808
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)
    regfree (&ep->regex);                               /* release compiled 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
11836

11837
11838
11839
11840
11841
11842
11843
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)
        regfree (&exp->rules[i].regex);                               /* release compiled 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
11868
11869



11870
11871
11872
11873
11874
11875


11876
11877
11878
11879
11880

11881
11882
11883
11884

11885
11886


11887
11888
11889
11890
11891
11892
11893
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 */
    int res;
    regex_t re;
    pcre *re;
    const char *errmsg;
    int erroffset, re_nsub;

    memset (&re, 0, sizeof(re));
    memcpy (match_buf, match+1, strlen(match)-2);       /* extract string without surrounding quotes */
    match_buf[strlen(match)-2] = '\0';
    res = regcomp (&re, (char *)match_buf, REG_EXTENDED | ((switches & EXP_TYP_REGEX_I) ? REG_ICASE : 0));
    if (res) {
    re = pcre_compile ((char *)match_buf, (switches & EXP_TYP_REGEX_I) ? PCRE_CASELESS : 0, &errmsg, &erroffset, NULL);
    if (re == NULL) {
        size_t err_size = regerror (res, &re, NULL, 0);
        char *err_buf = (char *)calloc (err_size+1, 1);

        regerror (res, &re, err_buf, err_size);
        sim_messagef (SCPE_ARG, "Regular Expression Error: %s\n", err_buf);
        sim_messagef (SCPE_ARG, "Regular Expression Error: %s\n", errmsg);
        free (err_buf);
        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, (int)re.re_nsub);
    regfree (&re);
    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
11928


11929
11930
11931
11932
11933
11934
11935
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';
    regcomp (&ep->regex, (char *)match_buf, REG_EXTENDED);
    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
12012

12013
12014
12015
12016
12017
12018
12019
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 instructions\n", (unsigned)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
12047

12048
12049
12050
12051
12052
12053
12054
12055
12056
12057
12058
12059
12060
12061
12062
12063


12064
12065
12066
12067
12068
12069
12070
12071
12072
12073
12074
12075
12076
12077
12078
12079
12080
12081

12082
12083
12084
12085
12086
12087
12088


12089
12090
12091
12092

12093
12094
12095
12096
12097


12098
12099
12100
12101
12102
12103
12104
12105
12106
12107
12108



12109
12110
12111
12112

12113
12114
12115
12116
12117
12118
12119
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;
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)
        regmatch_t *matches;
        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;
        matches = (regmatch_t *)calloc ((ep->regex.re_nsub + 1), sizeof(*matches));
        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);
            }
        if (!regexec (&ep->regex, cbuf, ep->regex.re_nsub + 1, matches, REG_NOTBOL)) {
        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<ep->regex.re_nsub + 1; j++) {
            for (j=0; j < (size_t)rc; j++) {
                char env_name[32];

                sprintf (env_name, "_EXPECT_MATCH_GROUP_%d", (int)j);
                memcpy (buf, &cbuf[matches[j].rm_so], matches[j].rm_eo-matches[j].rm_so);
                buf[matches[j].rm_eo-matches[j].rm_so] = '\0';
                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->regex.re_nsub;
            free (matches);
            sim_exp_match_sub_count = ep->re_nsub;
            free (ovector);
            ovector = NULL;
            free (buf);
            break;
            }
        free (matches);
        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
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
12267

12268
12269
12270

12271
12272
12273

12274
12275

12276
12277

12278
12279

12280
12281
12282
12283
12284
12285
12286
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 instructions (%d microseconds) before sending first character\n", (int)(snd->next_time - sim_gtime()),
        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 instructions before sending first character\n", (int)(snd->next_time - sim_gtime()));
        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 instructions (%d microseconds) between characters\n", (int)snd->delay, (int)(snd->delay/(sim_timer_inst_per_sec()/1000000.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 instructions between characters\n", (int)snd->delay);
    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 instructions\n", 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 instructions\n", after);
    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
12368

12369
12370
12371
12372

12373
12374
12375
12376
12377
12378
12379
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) {
    fwrite (buf, 1, len, sim_deb);              /* output now. */
    _debug_fwrite_all (buf, len, sim_deb);  /* output now. */
    return;
    }
if ((sim_deb == stdout) && (!sim_is_running))
    fwrite (buf, 1, len, stdout);               /* output now. */
    _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
12419

12420
12421
12422
12423
12424
12425
12426
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[32];
            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
12452

12453
12454
12455
12456
12457
12458
12459
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[32];
                    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
12548

12549
12550
12551
12552
12553
12554
12555
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'))) {
    clock_gettime(CLOCK_REALTIME, &time_now);
    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
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
13012

13013
13014
13015
13016
13017
13018
13019
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 || (f == sim_deb)) {
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
13069

13070
13071

13072
13073
13074
13075
13076





























13077
13078
13079
13080
13081
13082
13083
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)
    if (sim_oline)  /* output to tmxr socket if it is defined */
        tmxr_linemsgvf (sim_oline, fmt, args);
    else
    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
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
13499

13500
13501
13502
13503
13504
13505
13506
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++)
    fgets (tbuf, sizeof (tbuf), tmp);
    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
13544

13545
13546
13547
13548
13549
13550
13551
13552
13553
13554
13555



13556
13557
13558
13559
13560
13561
13562
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 int matchHelpTopicName (TOPIC *topic, const char *token)
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++) {
    strcpy (cbuf,topic->children[i]->title +
            ((topic->children[i]->flags & HLP_MAGIC_TOPIC)? 1 : 0));
    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
13646

13647
13648
13649
13650
13651
13652
13653
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())
    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
13722
13723



13724
13725
13726
13727
13728
13729
13730
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++) {
            strcpy (tbuf, topic->children[i]->title + 
                    ((topic->children[i]->flags & HLP_MAGIC_TOPIC)? 1 : 0));
            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


14211

14212
14213
14214
14215
14216
14217
14218
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));
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























14323
14324





14325
14326
14327
14328
14329
14330
14331
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))
                        *buf++ = *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
14380
14381
14382
14383
14384
14385
14386
14387
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 *start = cptr;
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
14485

14486








14487
14488
14489
14490
14491
14492
14493
14494
14495

14496
14497
14498
14499
14500
14501
14502
14503
14504
14505
14506
14507
14508
14509
14510

14511
14512
14513
14514
14515
14516
14517
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
    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
14650

14651
14652
14653
14654
14655

14656

















14657
14658
14659
14660
14661






14662
14663

14664






14665



14666

14667
14668
14669
14670



14671
14672
14673
14674
14675
14676
14677
14678
14679
14680
14681
14682
14683
14684





















14685








14686
14687
14688
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.
 */

static t_stat sim_library_unit_tests (void)
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)) {
        switch (DEV_TYPE(dptr)) {
#if defined(USE_SIM_CARD)
        case DEV_CARD:
            tstat = sim_card_test (dptr);
            break;
            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;
        default:
            break;
        }
    if (tstat != SCPE_OK)
            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;
}
Changes to src/SIMH/scp.h.
91
92
93
94
95
96
97



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115




116
117
118
119
120
121
122
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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
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
141
142
143
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);
char *sim_trim_endspc (char *cptr);
int sim_isspace (int c);
#ifdef isspace
#undef isspace
#endif
#ifndef IN_SCP_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_SCP_C
#define isalpha(chr) sim_isalpha (chr)
#endif
int sim_isprint (int c);
#ifdef isprint
#undef isprint
#endif
#ifndef IN_SCP_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_SCP_C
#define isgraph(chr) sim_isgraph (chr)
#endif
int sim_isalnum (int c);
#ifdef isalnum
#undef isalnum
#endif
#ifndef IN_SCP_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
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
331

332
333
334
335
336


337
338
339
340
341
342
343
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, DEVICE* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4);
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 && dptr && ((dptr)->dctrl & (dbits))) _sim_debug_device (dbits, dptr, __VA_ARGS__);} while (0)
#define sim_debug_unit(dbits, uptr, ...) do { if (sim_deb && uptr && (((uptr)->dctrl | (uptr)->dptr->dctrl) & (dbits))) _sim_debug_unit (dbits, uptr, __VA_ARGS__);} while (0)
#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
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
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
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 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 */
   The other per-simulator pointers can be overrriden by the init routine

WEAK extern void (*sim_vm_init) (void);
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                                           \
        int test_stat;                                          \
        const char *sim_test;                                   \
        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),            \
                        test_stat, sim_error_text(test_stat),   \
                        sim_error_text(test_stat), sim_test);   \
                        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);              \
Changes to src/SIMH/sim_card.c.
48
49
50
51
52
53
54













55
56
57
58
59
60
61
48
49
50
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
143
144


145
146
147
148
149
150
151
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     Y78   Y79     79         */
    0x604, 0x602, 0x601, 0x406, 0x806, 0x006, 0x005, 0xf000
   /*                     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
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
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     28 */
   /* 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     X0     T28    Y28    T78    T58 */
    0x204, 0x202, 0x201, 0xA00, 0x282, 0x882, 0x406, 0x212,
   /* T7     T8     T9     X28    Y78    T28    X78    T58 */
    0x204, 0x202, 0x201, 0x882, 0x406, 0x282, 0x806, 0x212,
   /*   `      a      b      c      d      e      f      g */
    0xf000,0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04,     /* 140 - 177 */
    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     YT     78    X78         */
    0x604, 0x602, 0x601, 0x405, 0x600, 0x805, 0x806,0xf000
   /*                       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
223

224
225
226

227
228
229
230
231
232
233


234
235
236
237
238
239
240
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    T28    T78    X58 */
   /* T7     T8     T9     X28    X68    Y28    Y78    X58 */
    0x204, 0x202, 0x201, 0x882, 0x20A, 0x482, 0x406, 0x212,
   /*   `      a      b      c      d      e      f      g */
    0x212, 0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04,     /* 140 - 177 */
    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    78     79         */
    0x604, 0x602, 0x601, 0x406, 0x806,0x0006,0x0005,0xf000
   /*                     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
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
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] = {
 /*  T0918   T91    T92    T93    T94    T95    T96   T97   0x0x */
 /*  T918    T91    T92    T93    T94    T95    T96   T97   0x0x */
   0xB03,  0x901, 0x881, 0x841, 0x821, 0x811, 0x809, 0x805,
 /*  T98,    T918 , T928,  T938,  T948,  T958,  T968, T978   */
 /*  T98,   T189 , T289,  T389,  T489,  T589,  T689, T789   */
   0x803,  0x903, 0x883, 0x843, 0x823, 0x813, 0x80B, 0x807,
 /*  TE918   E91    E92    E93    E94    E95    E96   E97   0x1x */
 /* 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      918   928    938     948    958   968     978   */
 /*  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    */
 /* 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    */
 /* 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
320

321
322
323
324
325
326
327
328
329

330
331
332
333
334
335
336
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 */
 /*  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  */
   0x182,  0x701, 0x280, 0x240, 0x220, 0x210, 0x208, 0x204,
   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
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
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 {
   char                  buffer[8192+500];    /* Buffer data */
   uint8                 buffer[8192+500];    /* Buffer data */
   int                   len;                 /* Amount of data in buffer */
   int                   size;                /* Size of last card read */
};

static int _cmpcard(const char *p, const char *s) {
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]) {
    int                   mode;
    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 |= buf->buffer[i];
            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
759
760


761
762
763
764
765
766
767
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_EBCDIC:
                           temp = ascii_to_hol_ebcdic[(int)c];
                    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
792

793
794

795
796
797
798
799
800
801
802
803
804
805
806


807
808
809
810
811
812
813
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 |= buf->buffer[i];
            temp |= (uint16)(buf->buffer[i] & 0xff);
            (*image)[col] = (buf->buffer[i++] >> 4) & 0xF;
            (*image)[col++] |= ((uint16)buf->buffer[i++]) << 4;
            (*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 (((uint8)buf->buffer[0]) == 0217 &&
                   (buf->len == 1 || (((uint8)buf->buffer[1]) & 0200) != 0)) {
        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
847

848
849
850
851
852
853
854
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 (((uint8)buf->buffer[0]) == 0217 && (((uint8)buf->buffer[1]) & 0200) != 0) {
        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
888

889
890
891
892
893
894
895
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 = buf->buffer[i] & 0xFF;
            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
934

935
936

937
938
939
940
941
942
943
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,
                       data->hopper_size * sizeof(*(data->images)));
                       (size_t)data->hopper_size * sizeof(*(data->images)));
            memset(&data->images[data->hopper_cards], 0,
                       (data->hopper_size - data->hopper_cards) *
                       (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
964

965
966

967
968
969
970
971
972
973
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,
                         data->hopper_size * sizeof(*(data->images)));
                         (size_t)data->hopper_size * sizeof(*(data->images)));
              memset(&data->images[data->hopper_cards], 0,
                         (data->hopper_size - data->hopper_cards) *
                         (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
1182

1183
1184
1185
1186



1187
1188
1189
1190
1191
1192
1193
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];
    int                  i;
    unsigned int         i;
    char                *saved_filename;
    t_bool              was_attached = (uptr->flags & UNIT_ATT);
    t_addr              saved_pos;
    static int          ebcdic_init = 0;
    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
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
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
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";
            int            mode = uptr->flags & UNIT_CARD_MODE;
            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), data->hopper_cards - previous_cards, cptr);
                       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









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
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 %sAttach Help\n\n", dptr->name, (uptr->flags & UNIT_RO) ? "Reader " : "Punch ");
    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%d carddeck\n\n", dptr->name, i);
                    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\n\n", dptr->name);
            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\n\n", dptr->name);
        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 and CBN)\n");
    if ((uptr->flags & UNIT_RO) == 0) {
    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");
    } else {
    }
    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
1402

1403
1404
1405
1406
1407
1408
1409
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)
#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
1433
1434


1435
1436
1437
1438


1439
1440
1441
1442
1443


1444
1445
1446
1447
1448


1449
1450
1451
1452
1453
1454
1455
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", sim_card_input_hopper_count(dptr->units));
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
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", sim_card_input_hopper_count(dptr->units));
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
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", sim_card_input_hopper_count(dptr->units));
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
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", sim_card_input_hopper_count(dptr->units));
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
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;
Changes to src/SIMH/sim_card.h.
50
51
52
53
54
55
56













57
58
59
60
61
62
63
50
51
52
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
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
129
130
131



132
133
134
135
136
137
138
139
140
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 */
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
Changes to src/SIMH/sim_console.c.
147
148
149
150
151
152
153
154

155
156
157
158
159
160
161
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_ttisatty (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
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
218
219
220
221





222
223
224
225
226
227
228
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") },
    { 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
433

434
435
436
437
438
439
440
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, cptr);
        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
635

636
637

638
639
640
641
642
643
644
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 cycles (dithered %d percent)\n", rem->smp_sample_interval, 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 cycles\n", rem->smp_sample_interval);
            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
746
747
748
749
750
751
752
753
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 },
    { "STEP",     &x_step_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
772
773
774
775
776
777
778
779
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 },
    { "STEP",     &x_step_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
872
873
874
875
876
877
878
879
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)];
int line = rem->line;

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

1403

1404
1405
1406
1407
1408
1409
1410
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_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
1749
1750



1751
1752



1753

1754
1755
1756
1757
1758
1759
1760
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 && 
                                                sim_rem_master_mode) {  /* can we process command now? */
                                            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 ();
                                                    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
1838
1839








1840
1841
1842
1843
1844
1845
1846
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)
        sim_activate(uptr, steps);                          /* check again after 'steps' instructions */
    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
1872
1873

1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888

1889
1890
1891
1892
1893
1894
1895
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 */
        }
    if (i != sim_rem_con_tmxr.lines)
        sim_activate_after (rem_con_data_unit, 100000);     /* continue polling for open sessions */
    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)                    /* Ir no connection limit set */
        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
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
2029

2030
2031
2032
2033
2034
2035
2036
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;
    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
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

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
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'), 
r = sim_open_logfile (gbuf, FALSE, &sim_log, &sim_log_ref); /* open log */
                            &sim_log, &sim_log_ref);    /* open log */
if (r != SCPE_OK)                                       /* error? */
    return r;
if (!sim_quiet)
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));
    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)
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
2267

2268
2269
2270
2271
2272
2273
2274
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;
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
2291

2292
2293
2294
2295
2296
2297
2298
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;

    clock_gettime(CLOCK_REALTIME, &sim_deb_basetime);
    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
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
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
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) */
    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;
            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
else c = c & 0377;
    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
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
3185

3186
3187
3188




3189
3190
3191
3192
3193
3194
3195
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_ttisatty ();
    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
3285

3286
3287

3288
3289
3290
3291
3292
3293
3294
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_ttisatty (void)
static t_bool sim_os_fd_isatty (int fd)
{
return isatty (fileno (stdin));
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
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
3449
3450


3451
3452
3453
3454
3455
3456
3457
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))
            SetConsoleMode(std_output, ENABLE_PROCESSED_OUTPUT);
        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
3486

3487
3488

3489














3490

3491
3492
3493
3494
3495
3496
3497
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_ttisatty (void)
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 (std_input) && (std_input != INVALID_HANDLE_VALUE) && GetConsoleMode (std_input, &Mode);
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
3641

3642
3643
3644
3645
3646
3647
3648
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_ttisatty (void)
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
3853

3854
3855
3856
3857
3858
3859
3860
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_ttisatty (void)
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
3996

3997
3998

3999
4000
4001
4002
4003
4004
4005
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_ttisatty (void)
static t_bool sim_os_fd_isatty (int fd)
{
return isatty (fileno (stdin));
return isatty (fd);
}

static t_stat sim_os_poll_kbd (void)
{
int status;
unsigned char buf[1];

4163
4164
4165
4166
4167
4168
4169
4170

4171
4172

4173
4174
4175
4176
4177
4178
4179
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_ttisatty (void)
static t_bool sim_os_fd_isatty (int fd)
{
return isatty (fileno (stdin));
return isatty (fd);
}

static t_stat sim_os_poll_kbd (void)
{
int status;
unsigned char buf[1];

4206
4207
4208
4209
4210
4211
4212
4213

4214
4215
4216
4217
4218
4219
4220
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;
(void)write (1, &c, 1);
if (write (1, &c, 1)) {};
return SCPE_OK;
}

#endif

/* Decode a string.

Changes to src/SIMH/sim_console.h.
56
57
58
59
60
61
62
63

64
65
66
67
68
69
70
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)
#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
130

131
132
133
134
135






136
137
138
139
140
141
118
119
120
121
122
123
124
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_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 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
Changes to src/SIMH/sim_defs.h.
89
90
91
92
93
94
95

96

97
98
99
100
101
102
103
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]     
        sim_stop_messages[]     array of pointers to stop messages
                                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
149

150
151
152
153
154
155




156
157
158
159
160
161
162
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_PCREPOSIX_H)
#if defined(HAVE_PCRE_H)
#include <pcreposix.h>
#include <pcre.h>
#define USE_REGEX 1
#elif defined(HAVE_REGEX_H)
#include <regex.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
322

323




324
325
326



327
328
329
330

331
332
333
334

335
336
337
338
339
340
341
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

/* Storage class modifier for weak link definition for sim_vm_init() */
/* Packed structure support */

#ifdef _MSC_VER
# define PACKED_BEGIN __pragma( pack(push, 1) )
# define PACKED_END __pragma( pack(pop) )
#else
#if defined(__cplusplus)
#if defined(__GNUC__)
#define WEAK __attribute__((weak))
# define PACKED_BEGIN
#if defined(_WIN32)
# define PACKED_END __attribute__((gcc_struct, packed))
#elif defined(_MSC_VER)
#define WEAK __declspec(selectany) 
#else
#define WEAK extern 
# define PACKED_END __attribute__((packed))
#endif
#else
#define WEAK 
#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
420

421
422
423
424
425
426
427
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 + 48)                /* Maximum SCPE Error Value */
#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
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
651
652
653
654
655
656
657
658















659
660
661
662
663
664
665
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   0000020         /* Unit registered as a calibrated timer */
#define UNIT_TAPE_MRK   0000040         /* Tape Unit AWS Tapemark */
#define UNIT_V_DF_TAPE  7               /* Bit offset for Tape Density reservation */
#define UNIT_S_DF_TAPE  3               /* Bits Reserved for Tape Density */
#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
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
744
745


746
747
748
749
750
751
752
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 */
                                                        /* REG * if MTAB_VAL */
                                                        /* int * if not */
                                                        /* 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
813


814
815
816
817
818
819
820
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)
    regex_t             regex;                          /* compiled regular expression */
    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
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
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) \
    nm, (loc), (rdx), (wd), (off), (dep), (desc), (flds), (qptr), (siz)
#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),(fl)
    _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),(fl)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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),((fl) | REG_UNIT)
    _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),((fl) | REG_UNIT)
    _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),((fl) | REG_UNIT)
    _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),((fl) | REG_STRUCT)
    _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),((fl) | REG_STRUCT)
    _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),((fl) | REG_STRUCT)
    _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),(fl)
    _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),(fl)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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)
    _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),((fl) | REG_UNIT)
    _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),((fl) | REG_UNIT)
    _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),((fl) | REG_UNIT)
    _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),((fl) | REG_STRUCT)
    _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),((fl) | REG_STRUCT)
    _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),((fl) | REG_STRUCT)
    _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




1083

1084
1085
1086
1087
1088
1089
1090
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
#if defined(__GNUC__) && !defined(__APPLE__) && !defined(__hpux) && !defined(__OpenBSD__) && !defined(_AIX)
#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
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
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 {                                                          \
      int tmr;                                                    \
      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;                          \
      for (tmr=0; tmr<SIM_NTIMERS; tmr++)                         \
          sim_clock_cosched_queue[tmr] = 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
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
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 {                                                          \
      int tmr;                                                    \
      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;                          \
      for (tmr=0; tmr<SIM_NTIMERS; tmr++)                         \
          sim_clock_cosched_queue[tmr] = 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


1254



1255
1256
1257
1258
1259
1260
1261
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);\
          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 */
Changes to src/SIMH/sim_disk.c.
29
30
31
32
33
34
35

36
37
38
39
40
41
42
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
92

93
94

95
96
97
98


99
100
101
102
103
104
105
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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 (2 = word, 1 = byte) */
    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
138

139
140
141
142
143
144
145
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);\
                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
172

173
174
175
176
177
178
179
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));
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
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







-
+




















-
+















-
+










-
+







    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));
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));
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);
    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);
    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
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
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);
static const char *sim_vhd_disk_get_dtype (FILE *f);
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", 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}
    { "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)
if ((cptr == NULL) || (*cptr == '\0'))
    return SCPE_ARG;
for (f = 0; fmts[f].name; f++) {
    if (fmts[f].name && (strcmp (cptr, fmts[f].name) == 0)) {
    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 */

t_stat sim_disk_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc)
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) {
        fprintf (st, "%s format", fmts[i].name);
        return SCPE_OK;
        }
fprintf (st, "invalid format");
        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
429

430
431
432
433
434
435
436
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");
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
456
457
458

459
460
461
462
463
464
465
466
467

468

469
470
471
472
473
474
475
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;

switch (DK_GET_FMT (uptr)) {                            /* case on format */
    case DKUF_F_STD:                                    /* SIMH format */
        physical_size = sim_fsize_ex (uptr->fileref);
if ((uptr->flags & UNIT_ATT) == 0)
        break;
    case DKUF_F_VHD:                                    /* VHD format */
        physical_size = sim_vhd_disk_size (uptr->fileref);
        break;
    case DKUF_F_RAW:                                    /* Raw Physical Disk Access */
        physical_size = sim_os_disk_size_raw (uptr->fileref);
        break;
    default:
        return (t_offset)-1;
    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
490

491
492
493
494
495
496
497
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));
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
527

528
529
530
531
532
533
534
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));
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
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
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);
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) {
    i = sim_fread (buf, ctx->xfer_element_size, tbc/ctx->xfer_element_size, uptr->fileref);
    if (i < tbc/ctx->xfer_element_size)                 /* fill */
        memset (&buf[i*ctx->xfer_element_size], 0, tbc-(i*ctx->xfer_element_size));
    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) && (sectsread))
    if (err)
        *sectsread = (t_seccnt)((i*ctx->xfer_element_size+ctx->sector_size-1)/ctx->sector_size);
        return SCPE_IOERR;
    tbc -= sectbytes;
    if ((tbc == 0) || (i == 0))
        return SCPE_OK;
    da += sectbytes;
    buf += sectbytes;
    }
return err;
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);
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) ? 512 : 1)))) {/* beyond the end of the disk */
    (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))))) {
    switch (DK_GET_FMT (uptr)) {                        /* case on format */
     (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 */
            return _sim_disk_rdsect (uptr, lba, buf, sectsread, sects);
            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;
    if (r != SCPE_OK)
        return r;
    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 */
    uint8 *tbuf = (uint8*) malloc (sects*ctx->sector_size + 2*ctx->storage_sector_size);
    t_lba sspsts = ctx->storage_sector_size/ctx->sector_size; /* sim sectors in a storage sector */
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);
    t_lba tlba = lba & ~(sspsts - 1);
    t_seccnt tsects = sects + (lba - tlba);
    uint32 soffset = (uint32)((lba * (t_offset)ctx->sector_size) - ssaddr);
    uint32 bytesread;

    tsects = (tsects + (sspsts - 1)) & ~(sspsts - 1);
    if (sectsread)
        *sectsread = 0;
    if (tbuf == NULL)
        return SCPE_MEM;
    switch (DK_GET_FMT (uptr)) {                        /* case on format */
        case DKUF_F_STD:                                /* SIMH format */
            r = _sim_disk_rdsect (uptr, tlba, tbuf, &sread, tsects);
            break;
        case DKUF_F_VHD:                                /* VHD format */
            r = sim_vhd_disk_rdsect (uptr, tlba, tbuf, &sread, tsects);
            if (r == SCPE_OK)
                sim_buf_swap_data (tbuf, ctx->xfer_element_size, (sread * ctx->sector_size) / ctx->xfer_element_size);
            break;
        case DKUF_F_RAW:                                /* Raw Physical Disk Access */
            r = sim_os_disk_rdsect (uptr, tlba, tbuf, &sread, tsects);
    r = sim_os_disk_read (uptr, ssaddr, tbuf, &bytesread, tbufsize & ~(ctx->storage_sector_size - 1));
            if (r == SCPE_OK)
                sim_buf_swap_data (tbuf, ctx->xfer_element_size, (sread * ctx->sector_size) / ctx->xfer_element_size);
    sim_buf_swap_data (tbuf + soffset, ctx->xfer_element_size, (bytesread - soffset) / ctx->xfer_element_size);
            break;
        default:
            free (tbuf);
            return SCPE_NOFNC;
        }
    if (r == SCPE_OK) {
        memcpy (buf, tbuf + ((lba - tlba) * ctx->sector_size), sects * ctx->sector_size);
        if (sectsread) {
            *sectsread = sread - (lba - tlba);
            if (*sectsread > sects)
                *sectsread = sects;
    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
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
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);
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) {
    i = sim_fwrite (buf, ctx->xfer_element_size, tbc/ctx->xfer_element_size, uptr->fileref);
    err = ferror (uptr->fileref);
    if ((!err) && (sectswritten))
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)
        *sectswritten = (t_seccnt)((i*ctx->xfer_element_size+ctx->sector_size-1)/ctx->sector_size);
    }
return 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);
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) == 16) ? 2 : 1; /* capacity units (word: 2, byte: 1) */
    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%d: Write Address Verification Error on lbn %d(0x%X) of %d(0x%X).\n", sim_dname (dptr), (int)(uptr-dptr->units), (int)(lba+sect), (int)(lba+sect), (int)total_sectors, (int)total_sectors);
            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 */
if (f == DKUF_F_STD)
    return _sim_disk_wrsect (uptr, lba, buf, sectswritten, sects);
    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)))
    if (!sim_end && (ctx->xfer_element_size != sizeof (char))) {
        switch (DK_GET_FMT (uptr)) {                            /* case on format */
            case DKUF_F_VHD:                                    /* VHD format */
                return sim_vhd_disk_wrsect  (uptr, lba, buf, sectswritten, sects);
            case DKUF_F_RAW:                                    /* Raw Physical Disk Access */
                return sim_os_disk_wrsect  (uptr, lba, buf, sectswritten, sects);
            default:
                return SCPE_NOFNC;
            }

    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);

    switch (DK_GET_FMT (uptr)) {                            /* case on format */
        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;
        }

        case DKUF_F_VHD:                                    /* VHD format */
            r = sim_vhd_disk_wrsect (uptr, lba, tbuf, sectswritten, sects);
            break;
        case DKUF_F_RAW:                                    /* Raw Physical Disk Access */
            r = sim_os_disk_wrsect (uptr, lba, tbuf, sectswritten, sects);
    r = sim_os_disk_wrsect (uptr, lba, buf, sectswritten, sects);
            break;
        default:
            r = SCPE_NOFNC;
            break;
        }
    }
    }
else { /* Unaligned and/or partial sector transfers */
    t_lba sspsts = ctx->storage_sector_size/ctx->sector_size; /* sim sectors in a storage sector */
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);
    t_lba tlba = lba & ~(sspsts - 1);
    t_seccnt tsects = sects + (lba - tlba);
    uint32 soffset = (uint32)((lba * (t_offset)ctx->sector_size) - ssaddr);
    uint32 byteswritten;

    tbuf = (uint8*) malloc (sects*ctx->sector_size + 2*ctx->storage_sector_size);
    tbuf = (uint8*) malloc (tbufsize);
    tsects = (tsects + (sspsts - 1)) & ~(sspsts - 1);
    if (sectswritten)
        *sectswritten = 0;
    if (tbuf == NULL)
        return SCPE_MEM;
    /* Partial Sector writes require a read-modify-write sequence for the partial sectors */
    if ((lba & (sspsts - 1)) ||
    if (soffset) 
        (sects < sspsts))
        switch (DK_GET_FMT (uptr)) {                            /* case on format */
            case DKUF_F_VHD:                                    /* VHD format */
                sim_vhd_disk_rdsect (uptr, tlba, tbuf, NULL, sspsts);
                break;
            case DKUF_F_RAW:                                    /* Raw Physical Disk Access */
                sim_os_disk_rdsect (uptr, tlba, tbuf, NULL, sspsts);
        sim_os_disk_read (uptr, ssaddr, tbuf, NULL, ctx->storage_sector_size);
                break;
            default:
                r = SCPE_NOFNC;
                break;
            }
    if ((tsects > sspsts) &&
        ((sects + lba - tlba) & (sspsts - 1)))
        switch (DK_GET_FMT (uptr)) {                            /* case on format */
            case DKUF_F_VHD:                                    /* VHD format */
                sim_vhd_disk_rdsect (uptr, tlba + tsects - sspsts,
                                     tbuf + (tsects - sspsts) * ctx->sector_size,
                                     NULL, sspsts);
                break;
            case DKUF_F_RAW:                                    /* Raw Physical Disk Access */
                sim_os_disk_rdsect (uptr, tlba + tsects - sspsts,
    sim_os_disk_read (uptr, sladdr, tbuf + (size_t)(sladdr - ssaddr), NULL, ctx->storage_sector_size);
                                    tbuf + (tsects - sspsts) * ctx->sector_size,
                                    NULL, sspsts);
                break;
            default:
                r = SCPE_NOFNC;
                break;
            }
    sim_buf_copy_swapped (tbuf + (lba & (sspsts - 1)) * ctx->sector_size,
    sim_buf_copy_swapped (tbuf + soffset,
                          buf, ctx->xfer_element_size, (sects * ctx->sector_size) / ctx->xfer_element_size);
    switch (DK_GET_FMT (uptr)) {                            /* case on format */
        case DKUF_F_VHD:                                    /* VHD format */
            r = sim_vhd_disk_wrsect (uptr, tlba, tbuf, sectswritten, tsects);
            break;
        case DKUF_F_RAW:                                    /* Raw Physical Disk Access */
            r = sim_os_disk_wrsect (uptr, tlba, tbuf, sectswritten, tsects);
    r = sim_os_disk_write (uptr, ssaddr, tbuf, &byteswritten, (soffset + (sects * ctx->sector_size) + ctx->storage_sector_size - 1) & ~(ctx->storage_sector_size - 1));
            break;
        default:
            r = SCPE_NOFNC;
            break;
        }
    if ((r == SCPE_OK) && sectswritten) {
        *sectswritten -= (lba - tlba);
    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
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
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
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)
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 = 512 * (t_offset)0xFFFFFFFFu;  /* Make sure we can access the largest sector */
t_offset temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu);  /* Make sure we can access the largest sector */
uint32 capac_factor;
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;
capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* save capacity units (word: 2, byte: 1) */
saved_capac = uptr->capac;
uptr->capac = (t_addr)(temp_capac/(capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1)));
if (sim_disk_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, NULL, sizeof (Home) / ctx->sector_size))
uptr->capac = (t_addr)temp_capac;
if ((_DEC_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, &sects_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 (sim_disk_rdsect (uptr, (Home.hm2_l_ibmaplbn+Home.hm2_w_ibmapsize+1) * (512 / ctx->sector_size), 
                           (uint8 *)&Header, NULL, sizeof (Header) / ctx->sector_size))
if ((_DEC_rdsect (uptr, (Home.hm2_l_ibmaplbn+Home.hm2_w_ibmapsize+1) * (512 / ctx->sector_size), 
                  (uint8 *)&Header, &sects_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
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
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 (sim_disk_rdsect (uptr, ScbLbn * (512 / ctx->sector_size), (uint8 *)&Scb, NULL, sizeof (Scb) / ctx->sector_size))
if ((_DEC_rdsect (uptr, ScbLbn * (512 / ctx->sector_size), (uint8 *)&Scb, &sects_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%d: '%s' Contains ODS%d File system\n", sim_dname (dptr), (int)(uptr-dptr->units), uptr->filename, Home.hm2_b_struclev);
sim_messagef (SCPE_OK, "%s%d: Volume Name: %12.12s ", sim_dname (dptr), (int)(uptr-dptr->units), Home.hm2_t_volname);
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)
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_offset temp_capac = 512 * (t_offset)0xFFFFFFFFu;  /* Make sure we can access the largest sector */
t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu);  /* Make sure we can access the largest sector */
uint32 capac_factor;
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;
capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* save capacity units (word: 2, byte: 1) */
saved_capac = uptr->capac;
uptr->capac = (t_addr)(temp_capac/(capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1)));
if (sim_disk_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, NULL, sizeof (Home) / ctx->sector_size))
uptr->capac = temp_capac;
if ((_DEC_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, &sects_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 (sim_disk_rdsect (uptr, (((Home.hm1_l_ibmaplbn << 16) + ((Home.hm1_l_ibmaplbn >> 16) & 0xFFFF)) + Home.hm1_w_ibmapsize + 1) * (512 / ctx->sector_size),
                           (uint8 *)&Header, NULL, sizeof (Header) / ctx->sector_size))
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, &sects_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 (sim_disk_rdsect (uptr, ScbLbn * (512 / ctx->sector_size), (uint8 *)Scb, NULL, 512 / ctx->sector_size))
if ((_DEC_rdsect (uptr, ScbLbn * (512 / ctx->sector_size), (uint8 *)Scb, &sects_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;
if (!sim_quiet) {
    sim_printf ("%s%d: '%s' Contains an ODS1 File system\n", sim_dname (dptr), (int)(uptr-dptr->units), uptr->filename);
    sim_printf ("%s%d: Volume Name: %12.12s ", sim_dname (dptr), (int)(uptr-dptr->units), Home.hm1_t_volname);
    sim_printf ("Format: %12.12s ", Home.hm1_t_format);
    sim_printf ("Sectors In Volume: %u\n", (uint32)(ret_val / 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)
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_offset temp_capac = 512 * (t_offset)0xFFFFFFFFu;  /* Make sure we can access the largest sector */
t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu);  /* Make sure we can access the largest sector */
uint32 capac_factor;
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;
capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* save capacity units (word: 2, byte: 1) */
saved_capac = uptr->capac;
uptr->capac = (t_addr)(temp_capac/(capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1)));
if (sim_disk_rdsect (uptr, 31 * (512 / ctx->sector_size), sector_buf, NULL, 512 / ctx->sector_size))
uptr->capac = temp_capac;
if ((_DEC_rdsect (uptr, 31 * (512 / ctx->sector_size), sector_buf, &sects_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;
        }
    }
if (!sim_quiet) {
    sim_printf ("%s%d: '%s' Contains Ultrix partitions\n", sim_dname (dptr), (int)(uptr-dptr->units), uptr->filename);
    sim_printf ("Partition with highest sector: %c, Sectors On Disk: %u\n", 'a' + max_lbn_partnum, max_lbn);
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, &sects_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, &sects_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, &sects_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 *)&sector_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);
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 ret_val = (t_offset)-1;
int i;

for (i = 0; checks[i] != NULL; i++) {
    ret_val = checks[i] (uptr);
    if (ret_val != (t_offset)-1)
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 dontautosize,
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_offset (*size_function)(FILE *file);
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
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
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, dontautosize, dbit, dtype, pdp11tracksize, completion_delay);
        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 vhd disk & copy contents? */
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 *vhd;
    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 (uptr, cptr, sector_size, xfer_element_size, dontautosize, dbit, dtype, pdp11tracksize, completion_delay);
    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, "Can't open source VHD: %s\n", cptr);
        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%d: creating new virtual disk '%s'\n", sim_dname (dptr), (int)(uptr-dptr->units), gbuf);
    capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (word: 2, byte: 1) */
    vhd = sim_vhd_disk_create (gbuf, ((t_offset)uptr->capac)*capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1));
    if (!vhd) {
        return sim_messagef (r, "%s%d: can't create virtual disk '%s'\n", sim_dname (dptr), (int)(uptr-dptr->units), gbuf);
    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(vhd);
                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) {
        for (lba = 0; (lba < total_sectors) && (r == SCPE_OK); lba += sects_read) {
            sim_messagef (SCPE_OK, "%s%d: Copied %dMB.  %d%% complete.\r", sim_dname (dptr), (int)(uptr-dptr->units), (int)((((float)lba)*sector_size)/1000000), (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, NULL, sects);
            if (r == SCPE_OK) {
            r = sim_disk_rdsect (uptr, lba, copy_buf, &sects_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, "VHD", NULL);
                uptr->fileref = vhd;
                r = sim_disk_wrsect (uptr, lba, copy_buf, NULL, sects);
                sim_disk_set_fmt (uptr, 0, dest_fmt, NULL);
                uptr->fileref = dest;
                r = sim_disk_wrsect (uptr, lba, copy_buf, &sects_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%d: Copied %dMB. Done.\n", sim_dname (dptr), (int)(uptr-dptr->units), (int)(((t_offset)lba*sector_size)/1000000));
            sim_messagef (SCPE_OK, "\n%s: Copied %u sectors. Done.\n", sim_uname (uptr), (uint32)total_sectors);
        else
            sim_messagef (r, "\n%s%d: Error copying: %s.\n", sim_dname (dptr), (int)(uptr-dptr->units), sim_error_text (r));
            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(vhd);
                    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) {
                sim_messagef (SCPE_OK, "%s%d: Verified %dMB.  %d%% complete.\r", sim_dname (dptr), (int)(uptr-dptr->units), (int)((((float)lba)*sector_size)/1000000), (int)((((float)lba)*100)/total_sectors));
            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, NULL, sects);
                r = sim_disk_rdsect (uptr, lba, copy_buf, &sects_read, sects);
                if (r == SCPE_OK) {
                    uint32 saved_unit_flags = uptr->flags;
                    FILE *save_unit_fileref = uptr->fileref;

                    sim_disk_set_fmt (uptr, 0, "VHD", NULL);
                    uptr->fileref = vhd;
                    r = sim_disk_rdsect (uptr, lba, verify_buf, NULL, sects);
                    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) || 
                        if (0 != memcmp (copy_buf, verify_buf, 1024*1024))
                            (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%d: Verified %dMB. Done.\n", sim_dname (dptr), (int)(uptr-dptr->units), (int)(((t_offset)lba*sector_size)/1000000));
                    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 < (1024*1024/sector_size); ++i)
                    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%d: Verification Error on lbn %d.\n", sim_dname (dptr), (int)(uptr-dptr->units), lba+i);
                    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 (vhd);
            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, "VHD", NULL);
            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 vhd */
        /* 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, dontautosize, dbit, dtype, pdp11tracksize, completion_delay);
            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;
            size_function = sim_vhd_disk_size;
            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;
            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;
            size_function = sim_os_disk_size_raw;
            storage_function = sim_os_disk_info_raw;
            uptr->fileref = NULL;
            break;
                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;
        size_function = sim_fsize_ex;
        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_fopen;
        size_function = sim_fsize_ex;
            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;
        size_function = sim_vhd_disk_size;
        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_os_disk_open_raw;
        size_function = sim_os_disk_size_raw;
            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) == 16) ? 2 : 1; /* save capacity units (word: 2, byte: 1) */
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);
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%d: unit is read only\n", sim_dname (dptr), (int)(uptr-dptr->units));
    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%d: unit is read only\n", sim_dname (dptr), (int)(uptr-dptr->units));
            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 _err_return (uptr, SCPE_OPENERR); /* yes, error */
                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 _err_return (uptr, SCPE_OPENERR);/* yes, error */
            sim_messagef (SCPE_OK, "%s%d: creating new file\n", sim_dname (dptr), (int)(uptr-dptr->units));
                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) {
    if ((created) && dtype)
        sim_vhd_disk_set_dtype (uptr->fileref, dtype);
    if (dtype && strcmp (dtype, sim_vhd_disk_get_dtype (uptr->fileref))) {
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, &sector_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), sim_vhd_disk_get_dtype (uptr->fileref));
        set_cmd (0, cmd);
        }
    }
uptr->flags = uptr->flags | UNIT_ATT;
            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 a zero sector to the last and the
       first sectors.  This serves 3 purposes:
       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

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
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 (1024*1024);
        uint8 *init_buf = (uint8*) malloc (init_buf_size);
        t_lba lba, sect;
        uint32 capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (word: 2, byte: 1) */
        t_seccnt sectors_per_buffer = (t_seccnt)((1024*1024)/sector_size);
        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, NULL, sects);
            if (r != SCPE_OK) {
            r = sim_disk_wrsect (uptr, lba, init_buf, &sects_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 SCPE_OPENERR;
                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%d: Initialized To Sector Address %dMB.  %d%% complete.\r", sim_dname (dptr), (int)(uptr-dptr->units), (int)((((float)lba)*sector_size)/1000000), (int)((((float)lba)*100)/total_sectors));
            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%d: Initialized To Sector Address %dMB.  100%% complete.\n", sim_dname (dptr), (int)(uptr-dptr->units), (int)((((float)lba)*sector_size)/1000000));
        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) == 16) ? 2 : 1; /* capacity units (word: 2, byte: 1) */
    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) {
    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, NULL, sects);
        r = sim_disk_rdsect (uptr, lba, verify_buf, &sects_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; sect++) {
            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%d: Verification Error on lbn %d(0x%X) of %d(0x%X).\n", sim_dname (dptr), (int)(uptr-dptr->units), (int)(lba+sect), (int)(lba+sect), (int)total_sectors, (int)total_sectors);
                    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%d: Verified containing Sector Address %dMB.  %d%% complete.\r", sim_dname (dptr), (int)(uptr-dptr->units), (int)((((float)lba)*sector_size)/1000000), (int)((((float)lba)*100)/total_sectors));
        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%d: Verified containing Sector Address %dMB.  100%% complete.\n", sim_dname (dptr), (int)(uptr-dptr->units), (int)((((float)lba)*sector_size)/1000000));
    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 = size_function (uptr->fileref);
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 (dontautosize) {
    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 != (t_offset)-1) &&
            (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%d: The file system on the disk %s is larger than simulated device (%s > ", sim_dname (dptr), (int)(uptr-dptr->units), cptr, sprint_capac (dptr, uptr));
                uptr->capac = saved_capac;
                sim_printf ("%s)\n", sprint_capac (dptr, uptr));
                }
            sim_disk_detach (uptr);
            return SCPE_OPENERR;
            }
        if ((container_size < current_unit_size) && 
            ((DKUF_F_VHD == DK_GET_FMT (uptr)) || (0 != (uptr->flags & UNIT_RO)))) {
                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%d: non expandable disk container '%s' is smaller than simulated device (%s < ", sim_dname (dptr), (int)(uptr-dptr->units), cptr, sprint_capac (dptr, uptr));
                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 */
    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
1819

1820
1821
1822
1823
1824
1825
1826
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);
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
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
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 3 different types:\n\n");
fprintf (st, "    SIMH   A disk is an unstructured binary file of the size appropriate\n");
fprintf (st, "           for the disk drive being simulated\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");
fprintf (st, "Virtual (VHD) Disks  supported conform to \"Virtual Hard Disk Image Format\n");
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 (0 == (uptr-dptr->units)) {
    if (dptr->numunits > 1) {
        uint32 i;
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)
                fprintf (st, "  sim> ATTACH {switches} %s%d diskfile\n", dptr->name, i);
        }
    else
    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
        fprintf (st, "  sim> ATTACH {switches} %s diskfile\n", dptr->name);
    }
                --skip_count;
            }
    }
else
    fprintf (st, "  sim> ATTACH {switches} %s diskfile\n\n", dptr->name);
    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 simh if the indicated\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 VHD and copy its contents from another disk (simh, VHD,\n");
fprintf (st, "                or RAW format). Add a -V switch to verify a copy operation.\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, "    -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 rq\n");
fprintf (st, "    RQ, address=20001468-2000146B*, no vector, 4 units\n");
fprintf (st, "    RQ0, 159MB, not attached, write enabled, RD54, autosize, SIMH format\n");
fprintf (st, "    RQ1, 159MB, not attached, write enabled, RD54, autosize, SIMH format\n");
fprintf (st, "    RQ2, 159MB, not attached, write enabled, RD54, autosize, SIMH format\n");
fprintf (st, "    RQ3, 409KB, not attached, write enabled, RX50, autosize, SIMH format\n");
fprintf (st, "  sim> atta rq0 RA81.vhd\n");
fprintf (st, "  sim> show rq0\n");
fprintf (st, "  RQ0, 456MB, attached to RA81.vhd, write enabled, RA81, autosize, VHD format\n");
fprintf (st, "  sim> set rq2 ra92\n");
fprintf (st, "  sim> att rq2 -f vhd RA92.vhd\n");
fprintf (st, "  RQ2: creating new file\n");
fprintf (st, "  sim> sho rq2\n");
fprintf (st, "  RQ2, 1505MB, attached to RA92.vhd, write enabled, RA92, autosize, VHD format\n");
fprintf (st, "  sim> ! dir RA92.vhd\n");
fprintf (st, "   Volume in drive H is New Volume\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, "   Volume Serial Number is F8DE-510C\n\n");
fprintf (st, "   Directory of H:\\Data\n\n");
fprintf (st, "  04/14/2011  12:57 PM             5,120 RA92.vhd\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> atta rq3 -d RA92-1-Diff.vhd RA92.vhd\n");
fprintf (st, "  sim> atta rq3 -c RA92-1.vhd RA92.vhd\n");
fprintf (st, "  RQ3: creating new virtual disk 'RA92-1.vhd'\n");
fprintf (st, "  RQ3: Copied 1505MB.  99%% complete.\n");
fprintf (st, "  RQ3: Copied 1505MB. Done.\n");
fprintf (st, "  sim> sh rq3\n");
fprintf (st, "  RQ3, 1505MB, attached to RA92-1.vhd, write enabled, RA92, autosize, VHD format\n");
fprintf (st, "  sim>  ! dir RA92*\n");
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, "   Volume in drive H is New Volume\n");
fprintf (st, "   Volume Serial Number is F8DE-510C\n\n");
fprintf (st, "   Directory of H:\\Data\n\n");
fprintf (st, "  04/14/2011  01:12 PM             5,120 RA92-1.vhd\n");
fprintf (st, "  04/14/2011  12:58 PM             5,120 RA92.vhd\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> sho rq2\n");
fprintf (st, "  RQ2, 1505MB, not attached, write enabled, RA92, autosize, VHD format\n");
fprintf (st, "  sim> set rq2 ra81\n");
fprintf (st, "  sim> set rq2 noauto\n");
fprintf (st, "  sim> sho rq2\n");
fprintf (st, "  RQ2, 456MB, not attached, write enabled, RA81, noautosize, VHD format\n");
fprintf (st, "  sim> set rq2 format=simh\n");
fprintf (st, "  sim> sho rq2\n");
fprintf (st, "  RQ2, 456MB, not attached, write enabled, RA81, noautosize, SIMH format\n");
fprintf (st, "  sim> atta rq2 -c RA81-Copy.vhd VMS055.dsk\n");
fprintf (st, "  RQ2: creating new virtual disk 'RA81-Copy.vhd'\n");
fprintf (st, "  RQ2: Copied 456MB.  99%% complete.\n");
fprintf (st, "  RQ2: Copied 456MB. Done.\n");
fprintf (st, "  sim> sho rq2\n");
fprintf (st, "  RQ2, 456MB, attached to RA81-Copy.vhd, write enabled, RA81, noautosize, VHD format\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_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
2120

2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
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 && (dptr->dctrl & reason)) {
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
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
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 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);
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);
addr = ((long long)lba) * ctx->sector_size;
        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, sects * ctx->sector_size, (LPDWORD)sectsread, &pos)) {
    if (sectsread)
        *sectsread /= ctx->sector_size;
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);
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, sects * ctx->sector_size, (LPDWORD)sectswritten, &pos)) {
    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 /= ctx->sector_size;
    return SCPE_OK;
    }
        *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 (__sun) || defined (__sun__) || defined (__hpux) || defined (_AIX)
#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
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
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 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);
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;
addr = ((off_t)lba) * ctx->sector_size;
bytesread = pread((int)((long)uptr->fileref), buf, sects * ctx->sector_size, addr);
if (bytesread < 0) {

    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)
        *sectsread = 0;
        *rbytesread = 0;
    return SCPE_IOERR;
    }
if (sectsread)
    *sectsread = bytesread / ctx->sector_size;
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 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);
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;
addr = ((off_t)lba) * ctx->sector_size;
byteswritten = pwrite((int)((long)uptr->fileref), buf, sects * ctx->sector_size, addr);
if (byteswritten < 0) {

    byteswritten = pwrite((int)((long)uptr->fileref), buf, bytestowrite, addr);
    if (byteswritten < 0) {
        return SCPE_IOERR;
        }
    if (sectswritten)
        *sectswritten = 0;
    return SCPE_IOERR;
    }
if (sectswritten)
    *sectswritten = byteswritten / ctx->sector_size;
        *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
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
2902

2903

2904
2905
2906
2907
2908
2909
2910
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)
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
3074

3075
3076

3077
3078
3079
3080
3081
3082
3083
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 400 bytes in size.
    This field contains zeroes. It is 328 bytes in size.
    */
    uint8 Reserved[400];
    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
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
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 */

static uint32 NtoHl(uint32 value);

#define VHD_Internal_SectorSize     512
static uint64 NtoHll(uint64 value);

typedef struct VHD_IOData *VHDHANDLE;

static t_stat ReadFilePosition(FILE *File, void *buf, size_t bufsize, size_t *bytesread, uint64 position)
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);
    err = ferror (File);
    if ((!err) && bytesread)
        *bytesread = i;
    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, size_t *byteswritten, uint64 position)
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);
    err = ferror (File);
    if ((!err) && byteswritten)
        *byteswritten = i;
    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
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
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 uint32
NtoHl(uint32 value)
{
uint8 *l = (uint8 *)&value;
return (uint32)l[3] | ((uint32)l[2]<<8) | ((uint32)l[1]<<16) | ((uint32)l[0]<<24);
}

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 uint32
NtoHl(uint32 value)
{
return value;
}

static uint64
NtoHll(uint64 value)
{
return value;
}
#else
static uint32
3413
3414
3415
3416
3417
3418
3419
3420

3421
3422
3423

3424
3425
3426
3427
3428
3429
3430
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*) malloc(512*((sizeof(**aBAT)*NtoHl(sDynamic->MaxTableEntries)+511)/512));
        *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),
                             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
3546

3547
3548
3549
3550
3551
3552





3553
3554
3555
3556
3557
3558
3559
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)
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
3598

3599
3600
3601








3602
3603
3604
3605
3606
3607
3608
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)
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
3704

3705
3706
3707
3708
3709
3710
3711
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;
    size_t BytesRead;
    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
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
3918

3919
3920
3921
3922
3923

3924
3925
3926
3927
3928
3929
3930
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 SizeInBytes = ((uint64)SizeInSectors) * BytesPerSector;
uint64 TableOffset;
uint32 MaxTableEntries;
VHDHANDLE hVHD = NULL;

if (SizeInBytes > ((uint64)(1024*1024*1024))*2040) {
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
3946

3947
3948
3949
3950
3951
3952
3953
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));
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
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
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
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)
{
uint64 BlockOffset = ((uint64)lba)*SectorSize;
uint32 BlocksRead = 0;
uint32 SectorsInRead;
size_t BytesRead = 0;

uint32 BytesRead;
t_stat r = ReadVirtualDisk(hVHD,
if (!hVHD || (hVHD->File == NULL)) {
    errno = EBADF;
    return SCPE_IOERR;
    }
if ((BlockOffset + sects*SectorSize) > (uint64)NtoHll (hVHD->Footer.CurrentSize)) {
    errno = ERANGE;
    return SCPE_IOERR;
    }
if (NtoHl (hVHD->Footer.DiskType) == VHD_DT_Fixed) {
    if (ReadFilePosition(hVHD->File,
                         buf,
                         sects*SectorSize,
                         &BytesRead,
                           buf,
                           sects * SectorSize,
                           &BytesRead,
                         BlockOffset)) {
        if (sectsread)
            *sectsread = (t_seccnt)(BytesRead/SectorSize);
        return SCPE_IOERR;
        }
    if (sectsread)
        *sectsread /= SectorSize;
    return SCPE_OK;
    }
/* We are now dealing with a Dynamically expanding or differencing disk */
while (sects) {
    uint32 SectorsPerBlock = NtoHl (hVHD->Dynamic.BlockSize)/SectorSize;
    uint64 BlockNumber = lba/SectorsPerBlock;
    uint32 BitMapBytes = (7+(NtoHl (hVHD->Dynamic.BlockSize)/SectorSize))/8;
    uint32 BitMapSectors = (BitMapBytes+SectorSize-1)/SectorSize;

    SectorsInRead = SectorsPerBlock - lba%SectorsPerBlock;
    if (SectorsInRead > sects)
        SectorsInRead = sects;
    if (hVHD->BAT[BlockNumber] == VHD_BAT_FREE_ENTRY) {
        if (!hVHD->Parent)
            memset (buf, 0, SectorSize*SectorsInRead);
        else {
            if (ReadVirtualDiskSectors(hVHD->Parent,
                                       buf,
                                       SectorsInRead,
                                       NULL,
                                       SectorSize,
                           SectorSize * (uint64)lba);
                                       lba)) {
                if (sectsread)
                    *sectsread = BlocksRead;
if (sectsread)
    *sectsread = BytesRead / SectorSize;
                return FALSE;
                }
            }
        }
    else {
        BlockOffset = SectorSize*((uint64)(NtoHl (hVHD->BAT[BlockNumber]) + lba%SectorsPerBlock + BitMapSectors));
        if (ReadFilePosition(hVHD->File,
                             buf,
                             SectorsInRead*SectorSize,
                             NULL,
                             BlockOffset)) {
            if (sectsread)
                *sectsread = BlocksRead;
            return SCPE_IOERR;
            }
        }
    sects -= SectorsInRead;
    buf = (uint8 *)(((char *)buf) + SectorSize*SectorsInRead);
    lba += SectorsInRead;
    BlocksRead += SectorsInRead;
    }
if (sectsread)
    *sectsread = BlocksRead;
return SCPE_OK;
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
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
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
WriteVirtualDiskSectors(VHDHANDLE hVHD,
                        uint8 *buf,
                        t_seccnt sects,
                        t_seccnt *sectswritten,
                        uint32 SectorSize,
WriteVirtualDisk(VHDHANDLE hVHD,
                 uint8 *buf,
                 uint32 BytesToWrite,
                 uint32 *BytesWritten,
                 uint64 Offset)
                        t_lba lba)
{
uint64 BlockOffset = ((uint64)lba)*SectorSize;
uint32 BlocksWritten = 0;
uint32 SectorsInWrite;
size_t BytesWritten = 0;
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 ((BlockOffset + sects*SectorSize) > (uint64)NtoHll(hVHD->Footer.CurrentSize)) {
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,
                          sects*SectorSize,
                          &BytesWritten,
                          BlockOffset)) {
                          BytesToWrite,
                          BytesWritten,
                          Offset))
        if (sectswritten)
            *sectswritten = (t_seccnt)(BytesWritten/SectorSize);
        return SCPE_IOERR;
        r = SCPE_IOERR;
        }
    if (sectswritten)
        *sectswritten /= SectorSize;
    return SCPE_OK;
    return r;
    }
/* We are now dealing with a Dynamically expanding or differencing disk */
while (sects) {
    uint32 SectorsPerBlock = NtoHl(hVHD->Dynamic.BlockSize)/SectorSize;
    uint64 BlockNumber = lba/SectorsPerBlock;
    uint32 BitMapBytes = (7+(NtoHl(hVHD->Dynamic.BlockSize)/SectorSize))/8;
    uint32 BitMapSectors = (BitMapBytes+SectorSize-1)/SectorSize;
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)) {
        if (sectswritten)
            *sectswritten = BlocksWritten;
        return SCPE_EOF;
        }
    if (BlockNumber != (Offset + BytesToWrite) / NtoHl (hVHD->Dynamic.BlockSize))
    SectorsInWrite = 1;
        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, SectorSize))
        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*SectorSize > BitMapBufferSize)
            BitMapBufferSize = BitMapSectors*SectorSize;
        BitMapBuffer = (uint8 *)calloc(1, BitMapBufferSize + SectorSize*SectorsPerBlock);
        if (BitMapBufferSize > BitMapSectors*SectorSize)
            BitMap = BitMapBuffer + BitMapBufferSize-BitMapBytes;
        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)))
        if (0 == (BlockOffset & (VHD_DATA_BLOCK_ALIGNMENT-1)))
            {  // Already aligned, so use padded BitMapBuffer
            if (WriteFilePosition(hVHD->File,
                                  BitMapBuffer,
                                  BitMapBufferSize + SectorSize*SectorsPerBlock,
                                  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*SectorSize;
            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*SectorSize;
            BlockOffset &= ~(VHD_DATA_BLOCK_ALIGNMENT - 1);
            BlockOffset -= BitMapSectors * VHD_Internal_SectorSize;
            if (WriteFilePosition(hVHD->File,
                                  BitMap,
                                  SectorSize * (BitMapSectors + SectorsPerBlock),
                                  (BitMapSectors * VHD_Internal_SectorSize) + NtoHl(hVHD->Dynamic.BlockSize),
                                  NULL,
                                  BlockOffset)) {
                free (BitMapBuffer);
                return SCPE_IOERR;
                }
            BlockOffset += BitMapSectors*SectorSize;
            BlockOffset += BitMapSectors * VHD_Internal_SectorSize;
            }
        free(BitMapBuffer);
        BitMapBuffer = BitMap = NULL;
        /* the BAT block address is the beginning of the block bitmap */
        BlockOffset -= BitMapSectors*SectorSize;
        hVHD->BAT[BlockNumber] = NtoHl((uint32)(BlockOffset/SectorSize));
        BlockOffset += SectorSize * (SectorsPerBlock + BitMapSectors);
        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
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
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) > 512*((sizeof(*hVHD->BAT)*NtoHl(hVHD->Dynamic.MaxTableEntries) + 511)/512))
            BATUpdateBufferSize = (uint32)(512*((sizeof(*hVHD->BAT)*NtoHl(hVHD->Dynamic.MaxTableEntries) + 511)/512) - (BATUpdateBufferAddress - ((uint8 *)hVHD->BAT)));
        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 */
            uint32 BlockSectors = SectorsPerBlock;

            BlockData = malloc(SectorsPerBlock*SectorSize);
            BlockData = malloc (NtoHl (hVHD->Dynamic.BlockSize));

            if (((lba/SectorsPerBlock)*SectorsPerBlock + BlockSectors) > ((uint64)NtoHll (hVHD->Footer.CurrentSize))/SectorSize)
                BlockSectors = (uint32)(((uint64)NtoHll (hVHD->Footer.CurrentSize))/SectorSize - (lba/SectorsPerBlock)*SectorsPerBlock);
            if (ReadVirtualDiskSectors(hVHD->Parent,
                                       (uint8*) BlockData,
                                       BlockSectors,
                                       NULL,
            if (ReadVirtualDisk(hVHD->Parent,
                                (uint8*) BlockData,
                                NtoHl (hVHD->Dynamic.BlockSize),
                                NULL,
                                       SectorSize,
                                       (lba/SectorsPerBlock)*SectorsPerBlock))
                                (Offset / NtoHl (hVHD->Dynamic.BlockSize)) * NtoHl (hVHD->Dynamic.BlockSize)))
                goto Fatal_IO_Error;
            if (WriteVirtualDiskSectors(hVHD,
                                        (uint8*) BlockData,
                                        BlockSectors,
                                        NULL,
            if (WriteVirtualDisk(hVHD,
                                 (uint8*) BlockData,
                                 NtoHl (hVHD->Dynamic.BlockSize),
                                 NULL,
                                        SectorSize,
                                        (lba/SectorsPerBlock)*SectorsPerBlock))
                                 (Offset / NtoHl (hVHD->Dynamic.BlockSize)) * NtoHl (hVHD->Dynamic.BlockSize)))
                goto Fatal_IO_Error;
            free(BlockData);
            }
        continue;
Fatal_IO_Error:
        free (BitMap);
        free (BlockData);
        fclose (hVHD->File);
        hVHD->File = NULL;
        return SCPE_IOERR;
        r = SCPE_IOERR;
        }
    else {
        BlockOffset = 512*((uint64)(NtoHl(hVHD->BAT[BlockNumber]) + lba%SectorsPerBlock + BitMapSectors));
        SectorsInWrite = SectorsPerBlock - lba%SectorsPerBlock;
        uint64 BlockOffset = VHD_Internal_SectorSize * ((uint64)(NtoHl(hVHD->BAT[BlockNumber]) + BitMapSectors)) + (Offset % NtoHl(hVHD->Dynamic.BlockSize));

        if (SectorsInWrite > sects)
            SectorsInWrite = sects;
        if (WriteFilePosition(hVHD->File,
                              buf,
                              SectorsInWrite*SectorSize,
                              BytesInWrite,
                              NULL,
                              BlockOffset)) {
            if (sectswritten)
                *sectswritten = BlocksWritten;
            return SCPE_IOERR;
            }
        }
IO_Done:
    sects -= SectorsInWrite;
    buf = (uint8 *)(((char *)buf) + SectorsInWrite*SectorSize);
    lba += SectorsInWrite;
    BlocksWritten += SectorsInWrite;
    }
                              &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 = BlocksWritten;
return SCPE_OK;
    *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, &sectors_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, &sectors_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;
}
Changes to src/SIMH/sim_disk.h.
37
38
39
40
41
42
43
44
45

46
47
48
49
50
51
52
53

54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72



















73
74
75
76
77
78
79
37
38
39
40
41
42
43


44
45
46
47
48
49
50
51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69


70
71
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_WLK      (UNIT_V_UF + 0)                 /* write locked */
#define DKUF_V_FMT      (UNIT_V_UF + 1)                 /* disk file format */
#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        (1u << DKUF_V_WLK)
#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 dontautosize, 
                        uint32 debugbit, const char *drivetype, uint32 pdp11_tracksize, int completion_delay);
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
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
Changes to src/SIMH/sim_ether.c.
52
53
54
55
56
57
58
59

60
61
62
63
64
65
66
67
68
69
70

71



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86



87
88
89
90
91
92
93
52
53
54
55
56
57
58

59
60
61
62
63
64
65
66
67
68
69

70
71
72
73
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         V3.0+
  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 available from: 
  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 necessary (see NOTE above about vendor supplied libpcap), 
        we've gotten the tarball, unpacked, built and installed it with:
        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
274

275
276
277
278
279
280
281
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_devices [remove non-ethernet devices]
  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
380

381
382
383
384
385
386
387
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 routines - forward declarations */
/* 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
420

421
422
423
424
425
426
427
428
429

430
431
432
433
434
435
436
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));
  getcwd (state.cwd, sizeof(state.cwd));
  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';
      fgets (filebuf, sizeof(filebuf)-1, f);
      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
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
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);
}

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);
}

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 */
}

static char*   (*p_pcap_lib_version) (void);

static ETH_DEV **eth_open_devices = NULL;
static int eth_open_device_count = 0;
static t_bool eth_show_active = FALSE;

#if defined (USE_NETWORK) || defined (USE_SHARED)
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;
        }
}
#endif

t_stat eth_show (FILE* st, UNIT* uptr, int32 val, CONST void* desc)
{
  ETH_LIST  list[ETH_MAX_DEVICE];
  int number;

  eth_show_active = TRUE;
  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 (p_pcap_lib_version) {
    fprintf(st, "%s\n", p_pcap_lib_version());
    }
  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]);
      }
    }
  eth_show_active = FALSE;
  return SCPE_OK;
}

t_stat eth_show_devices (FILE* st, DEVICE *dptr, UNIT* uptr, int32 val, CONST char *desc)
{
return eth_show (st, uptr, val, NULL);
}

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
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
965
966


967
968






969
970
971
972
973
974
975
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;}
int eth_devices (int max, ETH_LIST* dev)
  {return -1;}
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
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, &reghnd)) != 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, &regtype, regval, &reglen)) != 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
1075
1076
1077
1078
1079


1080
1081



1082
1083

1084


1085
1086
1087
1088
1089
1090
1091
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
#define __STR_QUOTE(tok) #tok
#define __STR(tok) __STR_QUOTE(tok)
                          "libpcap." __STR(HAVE_DLOPEN);
#endif
static const char* no_pcap = 

static char no_pcap[PCAP_ERRBUF_SIZE] =
#if defined(_WIN32) || defined(__CYGWIN__)
                          "wpcap load failure";
    "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 load failure";
    "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
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
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 */
        sim_printf ("Eth: Failed to load %s\n", lib_name);
#ifdef _WIN32
        sim_printf ("Eth: You must install Npcap or WinPcap 4.x to use networking\n");
#else
        sim_printf ("Eth: You must install libpcap to use networking\n");
#endif
        lib_loaded = 2;
        break;
      } else {
        /* library loaded OK */
        lib_loaded = 1;
      }

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
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);

      if ((lib_loaded == 1) && (!eth_show_active)) {
        /* log successful load */
        sim_messagef (SCPE_OK, "%s\n", 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 (a && (load_pcap() != 0)) {
  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 (a && (load_pcap() != 0)) {
  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 (a && (load_pcap() != 0)) {
  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 (a && (load_pcap() != 0)) {
  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 (a && (load_pcap() != 0)) {
  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 (a && (load_pcap() != 0)) {
  if (load_pcap() != 0) {
    p_pcap_freealldevs(a);
  }
}

void pcap_freecode(struct bpf_program* a) {
  if (a && (load_pcap() != 0)) {
  if (load_pcap() != 0) {
    p_pcap_freecode(a);
  }
}

char* pcap_geterr(pcap_t* a) {
  if (a && (load_pcap() != 0)) {
  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
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
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 (a && (load_pcap() != 0)) {
  if (load_pcap() != 0) {
    return p_pcap_setmintocopy(a, b);
  } else {
    return -1;
  }
}

HANDLE pcap_getevent(pcap_t* a) {
  if (a && (load_pcap() != 0)) {
  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 (a && (load_pcap() != 0)) {
  if (load_pcap() != 0) {
    return p_pcap_get_selectable_fd(a);
  } else {
    return 0;
  }
}
#endif

int pcap_fileno(pcap_t * a) {
  if (a && (load_pcap() != 0)) {
  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 (a && (load_pcap() != 0)) {
  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 (a && (load_pcap() != 0)) {
  if (load_pcap() != 0) {
    return p_pcap_setfilter(a, b);
  } else {
    return 0;
  }
}

int pcap_setnonblock(pcap_t* a, int nonblock, char *errbuf) {
  if (a && (load_pcap() != 0)) {
  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
1382

1383
1384
1385
1386
1387
1388
1389
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 ntddmdis.h */
#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


1570
1571


1572
1573
1574
1575


1576
1577


1578
1579

1580
1581

1582
1583
1584
1585
1586
1587
1588
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]",
        "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]",
        "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", devname);
    (void)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, "ifconfig %s | %s  >NIC.hwaddr", devname, patterns[i]);
      snprintf(command, sizeof(command)-1, patterns[i], (int)(sizeof(command) - (2 + strlen(patterns[i]))), devname);
      (void)system(command);
      if (NULL != (f = fopen("NIC.hwaddr", "r"))) {
      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
1608

1609
1610
1611
1612
1613
1614
1615
1616
1790
1791
1792
1793
1794
1795
1796

1797

1798
1799
1800
1801
1802
1803
1804







-
+
-







                }
              p1 = p2;
              }
            }
          else
            break;
          }
        fclose(f);
        pclose(f);
        remove("NIC.hwaddr");
        }
      }
    }
#endif
}

#if defined(__APPLE__)
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
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, &reghnd)) != ERROR_SUCCESS)
    return -1;
  if (buf_size < 37)
    return -1;
  reglen = buf_size;
  if ((status = RegQueryValueExA (reghnd, "MachineGuid", NULL, &regtype, buf, &reglen)) != ERROR_SUCCESS) {
  reglen = buf_size - 1;
  if ((status = RegQueryValueExA (reghnd, "MachineGuid", NULL, &regtype, (LPBYTE)buf, &reglen)) != 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"))) {
if ((f = fopen ("/etc/machine-id", "r")) == NULL) {
  fread (buf, 1, buf_size, f);
  fclose (f);
  f = popen ("hostname", "r");
  popened = TRUE;
  }
else {
  if ((f = popen ("hostname", "r"))) {
    fread (buf, 1, buf_size, f);
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
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
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;
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";
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
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
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 */
    strcpy(ifr.ifr_name, devname);
    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 = tun;
        *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 = tun;
        strcpy(savname, devname);
        *fd_handle = (SOCKET)tun;
        memmove(savname, devname, strlen(devname) + 1);
        }
#if defined (__APPLE__)
      if (1) {
      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
2107

2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120

2121
2122
2123
2124
2125
2126
2127
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 = vde_datafd((VDECONN*)(*handle));
      *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)))
      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
2167

2168
2169
2170
2171
2172
2173
2174
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);
            (void)system(command);
            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
2280

2281
2282
2283
2284
2285
2286
2287
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);
  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





2354

2355
2356
2357
2358
2359
2360
2361
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 SCPE_OK;
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
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
3044

3045
3046


3047
3048
3049
3050
3051


3052
3053
3054
3055
3056
3057
3058
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, uint16 *src_addr, uint16 *dest_addr, uint8 *buff)
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 destinationn addresses */
/* 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
3112

3113
3114
3115
3116
3117
3118
3119
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, (uint16 *)(&IP->source_ip), (uint16 *)(&IP->dest_ip), (uint8 *)UDP);
    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
3221

3222
3223
3224
3225
3226
3227
3228
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, (uint16 *)(&IP->source_ip), (uint16 *)(&IP->dest_ip), (uint8 *)TCP);
      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
3293

3294
3295
3296
3297
3298
3299
3300
3301

3302
3303
3304
3305
3306
3307
3308
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, (uint16 *)(&IP->source_ip), (uint16 *)(&IP->dest_ip), (uint8 *)UDP);
    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, (uint16 *)(&IP->source_ip), (uint16 *)(&IP->dest_ip), (uint8 *)TCP);
    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
3368

3369
3370
3371
3372
3373
3374
3375
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, ((function == 1) ? "loopbackreply" : "loopbackforward"));
eth_packet_trace(dev, response.msg, response.len, "loopbackforward");

++dev->loopback_packets_processed;

return 1;
}

static void
3767
3768
3769
3770
3771
3772
3773

3774

3775
3776
3777
3778
3779

3780
3781
3782
3783
3784
3785
3786
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)) 
  if (!addresses) return SCPE_ARG;
     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)
  eth_reflect(dev);
  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
3833

3834
3835
3836
3837
3838
3839
3840
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, buf);
                (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
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
4157
4158
4159
4160
4161
4162
4163




































































































































































4164
4165
4166
4167
4168
4169
4170







-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-







#endif
  }
#endif /* USE_BPF */

return SCPE_OK;
}

/*
     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.

*/
int eth_host_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;
#endif
  if ((NULL == conn) || (datalink != DLT_EN10MB)) {
    for (j=i; j<used-1; ++j)
      list[j] = list[j+1];
    --used;
    --i;
    }
  } /* 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, &reghnd)) != 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, &regtype, regval, &reglen)) != 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

#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 used;
}

int eth_devices(int max, ETH_LIST* list)
{
int i = 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) {
  sim_printf ("Eth: error in pcap_findalldevs: %s\n", errbuf);
  }
else {
  /* copy device list into the passed structure */
  for (i=0, dev=alldevs; dev && (i < max); dev=dev->next, ++i) {
    if ((dev->flags & PCAP_IF_LOOPBACK) || (!strcmp("any", dev->name))) continue;
    strlcpy(list[i].name, dev->name, sizeof(list[i].name));
    if (dev->description)
      strlcpy(list[i].desc, dev->description, sizeof(list[i].desc));
    else
      strlcpy(list[i].desc, "No description available", sizeof(list[i].desc));
    }

  /* free device list */
  pcap_freealldevs(alldevs);
  }
#endif

/* Add any host specific devices and/or validate those already found */
i = eth_host_devices(i, max, list);

/* If no devices were found and an error message was left in the buffer, display it */
if ((i == 0) && (errbuf[0])) {
    sim_printf ("Eth: pcap_findalldevs warning: %s\n", errbuf);
    }

/* return device count */
return i;
}

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
4192
4193
4194
4195
4196
4197
4198
4199
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 physical_addr = {0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
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
4228

4229
4230
4231
4232
4233
4234
4235
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 (&eth_tst, 0, sizeof(eth_tst));
eth_device_count = eth_devices(ETH_MAX_DEVICE, eth_list);
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)) ||
Changes to src/SIMH/sim_ether.h.
345
346
347
348
349
350
351
352

353
354
355
356
357
358
359
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);
int eth_devices   (int max, ETH_LIST* dev);             /* get ethernet devices on host */
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
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 */
Changes to src/SIMH/sim_fio.c.
40
41
42
43
44
45
46

47
48
49
50
51
52
53
54
55
56
57
58
59
60


61
62
63
64
65
66
67
40
41
42
43
44
45
46
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

241
242
243



















244
245
246


247
248

249
250

251


252
253
254
255
256
257
258
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 *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)
return fopen (file, mode, "ALQ=32", "DEQ=4096",
        "MBF=6", "MBC=127", "FOP=cbt,tef", "ROP=rah,wbh", "CTX=stm");
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)
return fopen64 (file, mode);
f = fopen64 (namebuf, mode);
#else
return fopen (file, mode);
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




382

383
384
385
386
387
388
389
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 (source_file, dest_file, !overwrite_existing))
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
530

531
532
533
534
535
536
537
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 (!stat (source_file, &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
560

561
562
563
564
565
566
567
568
569
570
571
572

573
574
575
576
577
578
579
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__)
#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)
{
#ifdef HAVE_SHM_OPEN
#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
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
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)
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 (HAVE_GCC_SYNC_BUILTINS)
return __sync_add_and_fetch((int *) p, 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 (HAVE_GCC_SYNC_BUILTINS)
#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
768

769
770
771
772
773
774
775
776
777
778
779
780
781
782


783

784
785
786
787
788
789
790
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 {
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);
        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



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
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, '/');
    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
871

872
873
874
875
876
877
878
879
880
881
882
883
884
885


886
887
888
889
890
891
892
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];

strlcpy (WildName, cptr, sizeof(WildName));
_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 || (!strcmp (slash, "/*")))    /* Separator wasn't mentioned? */
    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
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














































































































































































































































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];
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));
strlcpy (WildName, cptr, sizeof(WildName));
_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[PATH_MAX + 1];
    char *FileName;
    const char *MatchName = 1 + strrchr (cptr, '/');
    char *p_name;
     char *p_name;
    struct tm *local;
#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
#else /* !defined (HAVE_GLOB) */
    while ((ent = readdir (dir))) {
#if defined (HAVE_FNMATCH)
        if (fnmatch(MatchName, ent->d_name, 0))
            continue;
#else
        /* only match exact name without fnmatch support */
        if (strcmp(MatchName, ent->d_name) != 0)
#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
#endif /* defined (HAVE_FNMATCH) */
        FileName = (char *)malloc (1 + strlen (DirName) + strlen (ent->d_name));
        sprintf (FileName, "%s%s", DirName, ent->d_name);
#endif
#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;
    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 */
}

Changes to src/SIMH/sim_fio.h.
32
33
34
35
36
37
38


39
40
41
42
43
44
45
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
58
59
60
61
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Changes to src/SIMH/sim_rev.h.
44
45
46
47
48
49
50








51
52
53
54
55
56
57
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
Changes to src/SIMH/sim_serial.c.
358
359
360
361
362
363
364
365

366
367
368
369
370
371
372
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 ? " {" : "", d ? d : "", d ? ")" : "", serial_open_devices[i].line->serconfig);
                    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
451
452

453
454
455
456
457
458
459
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)
{
sim_close_os_serial (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 };
Changes to src/SIMH/sim_sock.c.
258
259
260
261
262
263
264

265
266
267
268
269
270
271
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
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
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;
        }
    else {
        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;
        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
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
693

694
695
696
697
698
699
700
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 (SCPE_OK on complete success or SCPE_ARG if 
        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
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
927

928
929
930
931
932
933
934
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, "fcntl");
        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
999

1000
1001
1002
1003
1004
1005
1006
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, "fcntl");
        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
1048

1049
1050
1051
1052
1053
1054
1055
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 (__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
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086

1087
1088
1089
1090
1091
1092
1093
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);
#ifdef AF_INET6
    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 */
#else
    strcpy(*connectaddr, inet_ntoa(((struct sockaddr_in *)&connectaddr)->s_addr));
#endif
    }

if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) {
    sta = sim_setnonblock (newsock);                    /* set nonblocking */
    if (sta == SOCKET_ERROR)                            /* fcntl error? */
        return sim_err_sock (newsock, "fcntl");
        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
1114

1115
1116
1117
1118
1119
1120
1121
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 (__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
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
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 (__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;

#ifdef AF_INET6
*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);
#else
strcpy(hostnamebuf, inet_ntoa(((struct sockaddr_in *)addr)->s_addr));
sprintf(portnamebuf, "%d", (int)ntohs(((struct sockaddr_in *)addr)->s_port)));
#endif
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 (__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);
Changes to src/SIMH/sim_sock.h.
116
117
118
119
120
121
122
123

124
125
126
127
128
129
130
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, 0)
#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);
Changes to src/SIMH/sim_tape.c.
96
97
98
99
100
101
102
103

104
105

106
107
108
109

110
111
112
113
114
115
116
117










118
119
120
121
122
123
124
96
97
98
99
100
101
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

struct sim_tape_fmt {
static struct sim_tape_fmt {
    const char          *name;                          /* name */
    int32          uflags;                         /* unit flags */
    int32               uflags;                         /* unit flags */
    t_addr              bot;                            /* bot test */
    t_addr              eom_remnant;                    /* potentially unprocessed data */
    };

    } fmts[] = {
static struct sim_tape_fmt fmts[MTUF_N_FMT] = {
    { "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",  0,       0,                      0 },
    { NULL,   0,       0 }
    { "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
146

147
148
149
150
151
152
153
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
    int                 asynch_io;          /* Asynchronous Interrupt scheduling enabled */
    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
175

176
177
178
179
180
181
182
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) || !ctx->asynch_io)
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
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
426

427
428
429
430
431
432
433
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 = 0;
    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

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
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);
    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)) ? MTSE_DBG_API : 0, 0);
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 filename to attach\n");
        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 (MT_GET_FMT (uptr) == MTUF_F_TAR) {
    if (sim_switches & SWMASK ('B')) {                  /* Record Size (blocking factor)? */
if (sim_switches & SWMASK ('B')) {                      /* Record Size (blocking factor)? */
        uint32 recsize;

        cptr = get_glyph (cptr, gbuf, 0);                   /* get spec */
        if (*cptr == 0)                                     /* must be more */
            return sim_messagef (SCPE_2FARG, "Missing Record Size and filename to attach\n");
        recsize = (uint32) get_uint (gbuf, 10, 65536, &r);
        if ((r != SCPE_OK) || (recsize == 0))
    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 (uptr->recsize == 0)
        uptr->recsize = TAR_DFLT_RECSIZE;
    }
if ((MT_GET_FMT (uptr) == MTUF_F_TPC) ||
    (MT_GET_FMT (uptr) == MTUF_F_TAR))
    sim_switches |= SWMASK ('R');                       /* Force ReadOnly attach for TPC and TAR tapes */
r = attach_unit (uptr, (CONST char *)cptr);             /* attach unit */
if (r != SCPE_OK)                                       /* error? */
    return sim_messagef (r, "Can't open tape image: %s\n", cptr);
    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
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
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
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 an AWS or TAR tapemark */
r = detach_unit (uptr);                                 /* detach unit */
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;

sim_tape_rewind (uptr);
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 (0 == (uptr - dptr->units)) {
    if (dptr->numunits > 1) {
        uint32 i;

        for (i=0; i < dptr->numunits; ++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 an attempt to create the indicated\n");
fprintf (st, "                virtual tape will be attempted).\n");
fprintf (st, "    -F          Open the indicated tape container in a specific format (default\n");
fprintf (st, "                is SIMH, alternatives are E11, TPC, P7B, AWS and TAR)\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, "                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.\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, "                contained in the tape image scan performed when it is attached.\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, "                contained in the tape image scan performed when it is attached.\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
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
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;
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) && 
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_fseek (uptr->fileref, uptr->pos, SEEK_SET)) {   /* set the initial tape position; if it fails */
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
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
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 = uptr->pos - sizeof (t_mtrlnt) / 2;  /*   then back up and resync */
            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_fseek (uptr->fileref, uptr->pos, SEEK_SET)) {   /* set the tape position; if it fails */
                    status = sim_tape_ioerr (uptr);                     /*   then quit with I/O error status */
                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 */
            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_fseek (uptr->fileref, uptr->pos - sizeof (t_mtrlnt), SEEK_SET)){  /*   then seek to the end of record size; if it fails */
            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_fseek (uptr->fileref, saved_pos, SEEK_SET))   /*   then seek back to the beginning of the data; if it fails */
            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 */
                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? */
                uptr->pos += sizeof (t_tpclnt);         /* spc over reclnt */
                if (tpcbc == TPC_TMK)                   /* tape mark? */
                    status = MTSE_TMK;
                else
                    uptr->pos = uptr->pos + ((tpcbc + 1) & ~1); /* spc over record */
                    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
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
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_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for read */
            (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:
        MT_CLR_INMRK (uptr);                        /* Not within an AWS tapemark */
        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 */
        if (ferror (uptr->fileref)) {           /* error? */
            MT_SET_PNU (uptr);                  /* pos not upd */
            status = sim_tape_ioerr (uptr);
            break;
            }
        if ((feof (uptr->fileref)) ||               /* eof? */
        if ((feof (uptr->fileref)) ||           /* eof? */
            (rdcnt < 3)) {
            uptr->tape_eom = uptr->pos;
            MT_SET_PNU (uptr);                      /* pos not upd */
            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? */
        uptr->pos += sizeof (t_awshdr);         /* spc over AWS header */
        if (awshdr.rectyp == AWS_TMK)           /* tape mark? */
            status = MTSE_TMK;
            MT_SET_INMRK (uptr);                    /* within an AWS tapemark */
            }
        else
            if (awshdr.rectyp != AWS_REC) {         /* Unknown record type */
                MT_SET_PNU (uptr);                  /* pos not upd */
        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 {                                  /* tape data record */
            else
                t_addr saved_pos;

                *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);
                (void)sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for read */
                (void)sim_fread (&awshdr, sizeof (t_awslnt), 3, uptr->fileref);
                if (awshdr.rectyp == AWS_TMK)
                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) && 
                    MT_SET_INMRK (uptr);            /* within an AWS tapemark */
                if (awshdr.prelen != *bc) {
                    status = MTSE_INVRL;
                    uptr->pos = saved_pos - sizeof (t_awslnt);
            ((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);
                    MT_CLR_INMRK (uptr);            /* not within an AWS tapemark */
                    }
                else
                    (void)sim_fseek (uptr->fileref, saved_pos, SEEK_SET); /* Move back to the data */
            }
        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_fseek (uptr->fileref, uptr->pos, SEEK_SET); 
            (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
1137

1138
1139

1140
1141
1142
1143
1144
1145
1146
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 */
    status = MTSE_BOT;                                  /*   then reading backward is not possible */
    return MTSE_BOT;                                    /*   then reading backward is not possible */

else switch (f) {                                       /* otherwise the read method depends on the tape format */
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
1174
1175
1176
1177




1178
1179
1180
1181
1182
1183
1184
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_fseek (uptr->fileref,                           /* seek back to the location */
                               uptr->pos - bufcap * sizeof (t_mtrlnt),  /*   corresponding to the start */
                               SEEK_SET)) {                             /*     of the buffer; if it fails */
                    status = sim_tape_ioerr (uptr);                     /*         and fail with I/O error status */
                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
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
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 */
            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 */
                *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 */
            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_fseek (uptr->fileref,                   /* seek to the start of the data area; if it fails */
                               uptr->pos + sizeof (t_mtrlnt),   /*   then return with I/O error status */
                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 */
                               SEEK_SET)) {
                    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_fseek (uptr->fileref, ppos, SEEK_SET);/* position */
        (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_fseek (uptr->fileref, uptr->pos + sizeof (t_tpclnt), SEEK_SET);
                (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;
            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 (bytes_in_buf == 0) {                /* Need to Fill Buffer */
                    if (uptr->pos < BUF_SZ) {
                        buf_offset = 0;
                        read_size = (size_t)uptr->pos;
                    if (buf_offset < BUF_SZ) {
                        read_size = (size_t)buf_offset;
                        buf_offset = 0;
                        }
                    else {
                        buf_offset = uptr->pos - (sbc - 1 + BUF_SZ);
                        read_size = BUF_SZ;
                        buf_offset -= BUF_SZ;
                        }
                    (void)sim_fseek (uptr->fileref, buf_offset, SEEK_SET);
                    (void)sim_tape_seek (uptr, buf_offset);
                    bytes_in_buf = sim_fread (buf, sizeof (uint8), read_size, uptr->fileref);
                    if (ferror (uptr->fileref)) {               /* error? */
                    if (ferror (uptr->fileref)) {       /* error? */
                        status = sim_tape_ioerr (uptr);
                        break;
                        }
                    if (feof (uptr->fileref)) {                 /* eof? */
                    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_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for next read */
                if (all_eof)                                    /* tape mark? */
                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 = sbc = 0;
        while ((sbc == 0) && (status == MTSE_OK)) {
            if (sim_tape_bot (uptr)) {                      /* if we start at BOT */
                status = MTSE_BOT;                          /*   then we're done */
        *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;
                }
            (void)sim_fseek (uptr->fileref, uptr->pos, SEEK_SET);/* position */
            memset (&awshdr, 0, sizeof (awshdr));
            rdcnt = sim_fread (&awshdr, sizeof (t_awslnt), 3, uptr->fileref);
            if (ferror (uptr->fileref)) {                   /* error? */
            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))) {
                    if (MT_TST_INMRK (uptr)) {
                        status = MTSE_TMK;
                        MT_CLR_INMRK (uptr);
                        uptr->pos -= sizeof (awshdr);
                        }
                    uptr->tape_eom = uptr->pos;
                    (void)sim_tape_seek (uptr, uptr->pos - sizeof (t_awshdr));/* position */
                    continue;
                    }
                    else
                        status = MTSE_EOM;                  /*   then we're done */
                    break;
                    }
                status = MTSE_EOM;
                break;
                }
                }
            if ((rdcnt != 3) || 
                ((awshdr.rectyp != AWS_REC) && 
                 (awshdr.rectyp != AWS_TMK))) {
                status = MTSE_INVRL;
                }
                break;
                }
            break;
            }
            if (MT_TST_INMRK (uptr))                    /* already in a tapemark? */
                awshdr.rectyp = AWS_REC;
            MT_CLR_INMRK (uptr);                        /* No longer in a tapemark */
            *bc = (t_mtrlnt)((awshdr.rectyp == AWS_REC) ? awshdr.prelen : 0);/* save rec lnt */
            sbc = *bc;                                  /* extract the record length */
            if ((awshdr.rectyp != AWS_TMK) ||
                (awshdr.prelen == 0)) {
        if (status != MTSE_OK)
            break;
        if (awshdr.prelen == 0)
                uptr->pos -= sizeof (t_awshdr);         /* position to the start of the record */
                uptr->pos -= awshdr.prelen;             /* Including the data length */

                if (sim_fseek (uptr->fileref,           /* seek to the start of the data area; if it fails */
                               uptr->pos + sizeof (t_awshdr),
                               SEEK_SET)) {
                    status = sim_tape_ioerr (uptr);     /* then return with I/O error status */
            status = MTSE_TMK;
        else {
            if ((uptr->tape_eom > 0) && 
                (uptr->pos >= uptr->tape_eom) && 
                (awshdr.rectyp == AWS_TMK)) {
                status = MTSE_TMK;
                    break;
                    }
                *bc = 0;                                /* save rec lnt */
                }
                }
            if (awshdr.rectyp == AWS_TMK) {             /* tape mark? */
                status = MTSE_TMK;
                if (awshdr.prelen != 0)
            else {
                status = MTSE_OK;
                *bc = (t_mtrlnt)awshdr.prelen;          /* save rec lnt */
                    MT_SET_INMRK (uptr);                /* Flag processing a tapemark header */
                }
            }
        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;
             (void)sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); 
             }

    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

1442
1443
1444
1445
1446












1447
1448
1449
1450
1451
1452
1453
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);
    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

1507
1508
1509










1510
1511
1512
1513
1514
1515
1516
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);
    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
1564

1565
1566
1567
1568
1569
1570
1571
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_fseek (uptr->fileref, uptr->pos, SEEK_SET))     /* set pos */
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
1622

1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635

1636
1637
1638
1639
1640
1641
1642
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_fseek (uptr->fileref, uptr->pos, SEEK_SET)) /* set pos */
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_fseek (uptr->fileref, uptr->pos, SEEK_SET)) /* set pos */
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
1670

1671
1672
1673
1674
1675
1676
1677
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_fseek (uptr->fileref, uptr->pos, SEEK_SET);         /* set pos */
(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
1730

1731
1732
1733
1734
1735
1736
1737
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 */
    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
1892

1893
1894
1895
1896
1897
1898
1899
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_fseek (uptr->fileref, uptr->pos, SEEK_SET)) {   /* position the tape; if it fails */
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
1946
1947


1948
1949
1950
1951
1952
1953
1954
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_fseek (uptr->fileref, uptr->pos, SEEK_SET)) /* position the tape; if it fails */
            return sim_tape_ioerr (uptr);                   /*   then quit with I/O error status */
        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
1972
1973


1974
1975
1976
1977
1978
1979
1980
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_fseek (uptr->fileref, uptr->pos, SEEK_SET)) /* position the tape; if it fails */
                return sim_tape_ioerr (uptr);                   /*   then quit with I/O error status */
            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
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
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 */
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_fseek (uptr->fileref, uptr->pos, SEEK_SET)) /* position the tape; if it fails */
    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_fseek (uptr->fileref, uptr->pos, SEEK_SET)) /*   then reposition the tape; if it fails */
        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 */
            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 */
    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
2425
2426
2427
2428
2429
2430
2431
2432
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);

*skipped = 0;
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
2668
2669



2670
2671

2672
2673
2674
2675
2676
2677
2678
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_fseek (uptr->fileref, uptr->pos, SEEK_SET);
if (uptr->flags & UNIT_ATT) {
    (void)sim_tape_seek (uptr, uptr->pos);
    }
MT_CLR_PNU (uptr);
MT_CLR_INMRK (uptr);                                    /* Not within an AWS or TAR tapemark */
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
2773

2774
2775
2776
2777
2778
2779
2780
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)? TRUE: FALSE;
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
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
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; f < MTUF_N_FMT; f++) {
    if (fmts[f].name && (strcmp (cptr, fmts[f].name) == 0)) {
        uptr->flags = (uptr->flags & ~MTUF_FMT) |
            (f << MTUF_V_FMT) | fmts[f].uflags;
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 SCPE_ARG;
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)
{
int32 f = MT_GET_FMT (uptr);

if (fmts[f].name)
    fprintf (st, "%s format", fmts[f].name);
fprintf (st, "%s format", _sim_tape_format_name (uptr));
else fprintf (st, "invalid format");
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;
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_fseek (uptr->fileref, tpos, SEEK_SET);
    i = sim_fread (&bc, sizeof (t_tpclnt), 1, uptr->fileref);
    (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
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
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 record_in_file = 0;
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? */
    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_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);
            break;
            }
                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) &&
    ((r != MTSE_EOM) || (sim_switches & SWMASK ('V')) || (sim_switches & SWMASK ('L')) ||
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')) ||
     ((uint32)(sim_fsize_ex (uptr->fileref) - (t_offset)uptr->pos) > fmts[MT_GET_FMT (uptr)].eom_remnant) ||
     (unique_record_sizes > 2 * tapemark_total))) {
        (remaining_data > 0) ||
        (unique_record_sizes > 2 * tapemark_total)) {
    remaining_data = (uint32)(sim_fsize_ex (uptr->fileref) - (t_offset)uptr->tape_eom);
    sim_printf ("Tape Image '%s' scanned as %s format.\n", uptr->filename, fmts[MT_GET_FMT (uptr)].name);
    if (r != MTSE_EOM)
        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,
        sim_printf ("After processing ");
    else
        sim_printf ("contains ");
    sim_printf ("%u bytes of tape data (%u records, %u tapemarks)\n",
                data_total, record_total, tapemark_total);
    if ((record_total > 0) && (sim_switches & SWMASK ('L'))) {
        sim_printf ("Comprising %d different sized records (in record size order):\n", unique_record_sizes);
        for (bc = 0; bc <= max; bc++) {
            if (rec_sizes[bc])
                sim_printf ("%8u %u byte records\n", rec_sizes[bc], (uint32)bc);
            }
        }
    if (r != MTSE_EOM)
        sim_printf ("Read Tape Record Returned Unexpected Status: %s\n", sim_tape_error_text (r));
    if (remaining_data > fmts[MT_GET_FMT (uptr)].eom_remnant)
        sim_printf ("%u bytes of unexamined data remain in the tape image file\n", remaining_data);
    }
                               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 ((!stop_cpu) && 
    (unique_record_sizes > 2 * tapemark_total)) {
    sim_printf ("An unreasonable number of record sizes(%u) vs tape marks (%u) have been found\n", unique_record_sizes, tapemark_total);
    sim_printf ("The tape format (%s) might not be correct for the '%s' tape image\n", fmts[MT_GET_FMT (uptr)].name, uptr->filename);
    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_fseek (uptr->fileref, uptr->pos, SEEK_SET);
(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 {
    else if (uptr->pos < map[p])
        hi = p - 1;
    else lo = p + 1;
        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
3302

3303
3304
3305
3306
3307

3308
3309
3310
3311
3312
3313
3314
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;
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 = 65535;
    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
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
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);
(void)remove (name);
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
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

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
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);
    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)
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, filename, format);
    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




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
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 APIs\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", "tar"));
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.2", "tar"));

sim_switches = saved_switches;
SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "aws"));

sim_switches = saved_switches;
SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "p7b"));
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;
sim_switches = saved_switches;
SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "tpc"));

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);
sim_switches = saved_switches;
SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "e11"));

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;
sim_switches = saved_switches;
SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "simh"));

SIM_TEST(sim_tape_test_remove_tape_files (dptr->units, "TapeTestFile1"));

return SCPE_OK;

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;
}
Changes to src/SIMH/sim_tape.h.
72
73
74
75
76
77
78

79
80
81
82
83
84
85
86
87
88

89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104







105
106
107
108




109
110
111
112
113
114
115
116








117
118
119
120



121
122
123
124


125
126

127
128
129
130
131
132
133
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94












95
96
97
98
99
100
101




102
103
104
105

106






107
108
109
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_PNU      (UNIT_V_UF + 0)                 /* position not upd */
#define MTUF_V_WLK      (UNIT_V_UF + 1)                 /* write locked */
#define MTUF_V_FMT      (UNIT_V_UF + 2)                 /* tape file format */
#define MTUF_W_FMT      3                               /* 3b of formats */
#define MTUF_N_FMT      (1u << MTUF_W_FMT)              /* number of formats */
#define MTUF_M_FMT      ((1u << MTUF_W_FMT) - 1)
#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 */
#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 */
#define MTUF_V_UF       (MTUF_V_FMT + MTUF_W_FMT)
#define MTUF_PNU        (1u << MTUF_V_PNU)
#define MTUF_WLK        (1u << MTUF_V_WLK)
#define MTUF_FMT        (MTUF_M_FMT << MTUF_V_FMT)
/* 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 MTUF_WRP        (MTUF_WLK | UNIT_RO)

#define MT_F_STD        (MTUF_F_STD << MTUF_V_FMT)
#define MT_F_E11        (MTUF_F_E11 << MTUF_V_FMT)
#define MT_F_TPC        (MTUF_F_TPC << MTUF_V_FMT)
#define MT_F_P7B        (MTUF_F_P7B << MTUF_V_FMT)
#define MT_F_AWS        (MTUF_F_AWS << MTUF_V_FMT)
#define MT_F_TAR        (MTUF_F_TAR << MTUF_V_FMT)
#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)->flags = (u)->flags | MTUF_PNU
#define MT_CLR_PNU(u)   (u)->flags = (u)->flags & ~MTUF_PNU
#define MT_TST_PNU(u)   ((u)->flags & MTUF_PNU)
#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)->flags >> MTUF_V_FMT) & MTUF_M_FMT)
#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
Changes to src/SIMH/sim_timer.c.
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
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 double sim_stop_time = 0;                    /* time when sim_stop_timer_services was called */
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;
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 = 0;
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 10
#define CLK_INIT (SIM_INITIAL_IPS/CLK_TPS)
#define CLK_TPS 100
#define CLK_INIT (sim_precalibrate_ips/CLK_TPS)
static int32 sim_int_clk_tps;
static UNIT *sim_clock_unit[SIM_NTIMERS+1] = {NULL};
UNIT * volatile sim_clock_cosched_queue[SIM_NTIMERS+1] = {NULL};
static int32 sim_cosched_interval[SIM_NTIMERS+1];

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
266

267
268
269
270
271
272
273
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 / 1000000));
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
707

708
709
710
711
712
713
714
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 (int32 tmr, int32 time);
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
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
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 int32 rtc_ticks[SIM_NTIMERS+1] = { 0 };            /* ticks */
static uint32 rtc_hz[SIM_NTIMERS+1] = { 0 };              /* tick rate */
static uint32 rtc_last_hz[SIM_NTIMERS+1] = { 0 };         /* prior tick rate */
static uint32 rtc_rtime[SIM_NTIMERS+1] = { 0 };           /* real time */
static uint32 rtc_vtime[SIM_NTIMERS+1] = { 0 };           /* virtual time */
static double rtc_gtime[SIM_NTIMERS+1] = { 0 };           /* instruction time */
static uint32 rtc_nxintv[SIM_NTIMERS+1] = { 0 };          /* next interval */
static int32 rtc_based[SIM_NTIMERS+1] = { 0 };            /* base delay */
static int32 rtc_currd[SIM_NTIMERS+1] = { 0 };            /* current delay */
static int32 rtc_initd[SIM_NTIMERS+1] = { 0 };            /* initial delay */
static uint32 rtc_elapsed[SIM_NTIMERS+1] = { 0 };         /* sec since init */
static uint32 rtc_calibrations[SIM_NTIMERS+1] = { 0 };    /* calibration count */
static double rtc_clock_skew_max[SIM_NTIMERS+1] = { 0 };  /* asynchronous max skew */
static double rtc_clock_start_gtime[SIM_NTIMERS+1] = { 0 };/* reference instruction time for clock */
static double rtc_clock_tick_size[SIM_NTIMERS+1] = { 0 }; /* 1/hz */
static uint32 rtc_calib_initializations[SIM_NTIMERS+1] = { 0 };/* Initialization Count */
static double rtc_calib_tick_time[SIM_NTIMERS+1] = { 0 }; /* ticks time */
static double rtc_calib_tick_time_tot[SIM_NTIMERS+1] = { 0 };/* ticks time - total*/
static uint32 rtc_calib_ticks_acked[SIM_NTIMERS+1] = { 0 };/* ticks Acked */
static uint32 rtc_calib_ticks_acked_tot[SIM_NTIMERS+1] = { 0 };/* ticks Acked - total */
static uint32 rtc_clock_ticks[SIM_NTIMERS+1] = { 0 };/* ticks delivered since catchup base */
static uint32 rtc_clock_ticks_tot[SIM_NTIMERS+1] = { 0 };/* ticks delivered since catchup base - total */
static double rtc_clock_init_base_time[SIM_NTIMERS+1] = { 0 };/* reference time for clock initialization */
static double rtc_clock_tick_start_time[SIM_NTIMERS+1] = { 0 };/* reference time when ticking started */
static double rtc_clock_catchup_base_time[SIM_NTIMERS+1] = { 0 };/* reference time for catchup ticks */
static uint32 rtc_clock_catchup_ticks[SIM_NTIMERS+1] = { 0 };/* Record of catchups */
static uint32 rtc_clock_catchup_ticks_tot[SIM_NTIMERS+1] = { 0 };/* Record of catchups - total */
static t_bool rtc_clock_catchup_pending[SIM_NTIMERS+1] = { 0 };/* clock tick catchup pending */
static t_bool rtc_clock_catchup_eligible[SIM_NTIMERS+1] = { 0 };/* clock tick catchup eligible */
static uint32 rtc_clock_time_idled[SIM_NTIMERS+1] = { 0 };/* total time idled */
static uint32 rtc_clock_time_idled_last[SIM_NTIMERS+1] = { 0 };/* total time idled */
static uint32 rtc_clock_calib_skip_idle[SIM_NTIMERS+1] = { 0 };/* Calibrations skipped due to idling */
static uint32 rtc_clock_calib_gap2big[SIM_NTIMERS+1] = { 0 };/* Calibrations skipped Gap Too Big */
static uint32 rtc_clock_calib_backwards[SIM_NTIMERS+1] = { 0 };/* Calibrations skipped Clock Running Backwards */
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 */
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_timer_units[SIM_NTIMERS+1];                    /* Clock assist units                         */
                                                        /* one for each timer and one for an internal */
                                                        /* clock if no clocks are registered.         */
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++)
    if (rtc_initd[tmr] != 0)
        sim_rtcn_init (rtc_initd[tmr], tmr);
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 or after any breakpoint/continue.
 * Re-initializing happens on any boot.
 */
if (rtc_currd[tmr])
    time = rtc_currd[tmr];
if (rtc->currd)
    time = rtc->currd;
if (!uptr)
    uptr = sim_clock_unit[tmr];
    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 (!sim_clock_unit[tmr])
    if (!rtc->clock_unit)
        sim_register_clock_unit_tmr (uptr, tmr);
    }
rtc_clock_start_gtime[tmr] = sim_gtime();
rtc_rtime[tmr] = sim_os_msec ();
rtc_vtime[tmr] = rtc_rtime[tmr];
rtc_nxintv[tmr] = 1000;
rtc_ticks[tmr] = 0;
rtc_last_hz[tmr] = rtc_hz[tmr];
rtc_hz[tmr] = 0;
rtc_based[tmr] = time;
rtc_currd[tmr] = time;
rtc_initd[tmr] = time;
rtc_elapsed[tmr] = 0;
rtc_calibrations[tmr] = 0;
rtc_clock_ticks_tot[tmr] += rtc_clock_ticks[tmr];
rtc_clock_ticks[tmr] = 0;
rtc_calib_tick_time_tot[tmr] += rtc_calib_tick_time[tmr];
rtc_calib_tick_time[tmr] = 0;
rtc_clock_catchup_pending[tmr] = FALSE;
rtc_clock_catchup_eligible[tmr] = FALSE;
rtc_clock_catchup_ticks_tot[tmr] += rtc_clock_catchup_ticks[tmr];
rtc_clock_catchup_ticks[tmr] = 0;
rtc_calib_ticks_acked_tot[tmr] += rtc_calib_ticks_acked[tmr];
rtc_calib_ticks_acked[tmr] = 0;
++rtc_calib_initializations[tmr];
rtc_clock_init_base_time[tmr] = sim_timenow_double ();
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 (int32 ticksper, int32 tmr)
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;
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[tmr] != ticksper) {                          /* changing tick rate? */
    if (rtc_hz[tmr] == 0)
        rtc_clock_tick_start_time[tmr] = sim_timenow_double ();
    if ((rtc_last_hz[tmr] != 0) && 
        (rtc_last_hz[tmr] != ticksper) && 
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[tmr] = (int32)(sim_timer_inst_per_sec () / ticksper);
    rtc_last_hz[tmr] = rtc_hz[tmr];
    rtc_hz[tmr] = ticksper;
        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[tmr] = 1.0 / ticksper;
        sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_calb(ticksper=%d,tmr=%d) currd=%d\n", ticksper, tmr, rtc_currd[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\n", ticksper, tmr, rtc_currd[tmr]);
        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 (sim_clock_unit[tmr] == NULL) {                      /* Not using TIMER units? */
    rtc_clock_ticks[tmr] += 1;
    rtc_calib_tick_time[tmr] += rtc_clock_tick_size[tmr];
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[tmr]) {                   /* catchup tick? */
    ++rtc_clock_catchup_ticks[tmr];                     /* accumulating which were catchups */
    rtc_clock_catchup_pending[tmr] = FALSE;
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[tmr] = rtc_ticks[tmr] + 1;                    /* count ticks */
if (rtc_ticks[tmr] < ticksper)                          /* 1 sec yet? */
    return rtc_currd[tmr];
rtc_ticks[tmr] = 0;                                     /* reset ticks */
rtc_elapsed[tmr] = rtc_elapsed[tmr] + 1;                /* count sec */
if (!rtc_avail)                                         /* no timer? */
    return rtc_currd[tmr];
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[tmr] = (int32)(sim_timer_inst_per_sec()/ticksper);
    sim_debug (DBG_CAL, &sim_timer_dev, "calibrated tmr=%d against internal system tmr=%d, tickper=%d (result: %d)\n", tmr, sim_calb_tmr, ticksper, rtc_currd[tmr]);
    return rtc_currd[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 */
++rtc_calibrations[tmr];                                /* count calibrations */
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[tmr]) {                       /* time running backwards? */
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[tmr];                   /* Count statistic */
    sim_debug (DBG_CAL, &sim_timer_dev, "time running backwards - OldTime: %u, NewTime: %u, result: %d\n", rtc_rtime[tmr], new_rtime, rtc_currd[tmr]);
    rtc_rtime[tmr] = new_rtime;                         /* reset wall time */
    return rtc_currd[tmr];                              /* can't calibrate */
    ++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[tmr];               /* elapsed wtime */
rtc_rtime[tmr] = new_rtime;                             /* adv wall time */
rtc_vtime[tmr] = rtc_vtime[tmr] + 1000;                 /* adv sim time */
if (delta_rtime > 30000) {                              /* gap too big? */
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[tmr];                     /* Count statistic */
    rtc_vtime[tmr] = rtc_rtime[tmr];                    /* sync virtual and real time */
    rtc_nxintv[tmr] = 1000;                             /* reset next interval */
    rtc_gtime[tmr] = sim_gtime();                       /* save instruction time */
    sim_debug (DBG_CAL, &sim_timer_dev, "gap too big: delta = %d - result: %d\n", delta_rtime, rtc_currd[tmr]);
    return rtc_currd[tmr];                              /* can't calibr */
    ++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 */
    }
if (delta_rtime == 0)                                   /* avoid divide by zero  */
    last_idle_pct = 0;                                  /* force calibration */
last_idle_pct = 0;                                  /* normally force calibration */
else
    last_idle_pct = MIN(100, (uint32)(100.0 * (((double)(rtc_clock_time_idled[tmr] - rtc_clock_time_idled_last[tmr])) / ((double)delta_rtime))));
rtc_clock_time_idled_last[tmr] = rtc_clock_time_idled[tmr];
if (last_idle_pct > (100 - sim_idle_calib_pct)) {
    rtc_rtime[tmr] = new_rtime;                         /* save wall time */
    rtc_vtime[tmr] = rtc_vtime[tmr] + 1000;             /* adv sim time */
    rtc_gtime[tmr] = sim_gtime();                       /* save instruction time */
    ++rtc_clock_calib_skip_idle[tmr];
    sim_debug (DBG_CAL, &sim_timer_dev, "skipping calibration due to idling (%d%%) - result: %d\n", last_idle_pct, rtc_currd[tmr]);
    return rtc_currd[tmr];                              /* avoid calibrating idle checks */
    }
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[tmr]) / delta_rtime);
    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[tmr]) / (delta_rtime / sim_idle_rate_ms));
        sim_idle_cyc_sleep = (uint32)((new_gtime - rtc->gtime) / (delta_rtime / sim_idle_rate_ms));
    }
if (sim_asynch_timer) {
    /* An asynchronous clock, merely needs to divide the number of */
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[tmr])/ticksper);
    new_currd = (int32)((new_gtime - rtc->gtime)/ticksper);
    /* avoid excessive swings in the calibrated result */
    if (new_currd > 10*rtc_currd[tmr])              /* don't swing big too fast */
        new_currd = 10*rtc_currd[tmr];
    else
        if (new_currd < rtc_currd[tmr]/10)          /* don't swing small too fast */
            new_currd = rtc_currd[tmr]/10;
    rtc_currd[tmr] = new_currd;
    rtc_gtime[tmr] = new_gtime;                     /* save instruction time */
    sim_debug (DBG_CAL, &sim_timer_dev, "asynch calibration result: %d\n", rtc_currd[tmr]);
    return rtc_currd[tmr];                          /* 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[tmr] = new_gtime;                             /* save instruction time */
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[tmr] = rtc_based[tmr] * ticksper;         /* slew wide */
if (delta_rtime == 0)                           /* gap too small? */
    rtc->based = rtc->based * ticksper;         /* slew wide */
else
    rtc_based[tmr] = (int32) (((double) rtc_based[tmr] * (double) rtc_nxintv[tmr]) /
    rtc->based = (int32) (((double) rtc->based * (double) rtc->nxintv) /
                                ((double) delta_rtime));/* new base rate */
delta_vtime = rtc_vtime[tmr] - rtc_rtime[tmr];          /* gap */
if (delta_vtime > SIM_TMAX)                             /* limit gap */
delta_vtime = rtc->vtime - rtc->rtime;          /* gap */
if (delta_vtime > SIM_TMAX)                     /* limit gap */
    delta_vtime = SIM_TMAX;
else {
else if (delta_vtime < -SIM_TMAX)
    delta_vtime = -SIM_TMAX;
rtc_nxintv[tmr] = 1000 + delta_vtime;                   /* next wtime */
rtc_currd[tmr] = (int32) (((double) rtc_based[tmr] * (double) rtc_nxintv[tmr]) /
    1000.0);                                            /* next delay */
if (rtc_based[tmr] <= 0)                                /* never negative or zero! */
    rtc_based[tmr] = 1;
if (rtc_currd[tmr] <= 0)                                /* never negative or zero! */
    rtc_currd[tmr] = 1;
sim_debug (DBG_CAL, &sim_timer_dev, "calibrated tmr=%d, tickper=%d (base=%d, nxintv=%u, result: %d)\n", tmr, ticksper, rtc_based[tmr], rtc_nxintv[tmr], rtc_currd[tmr]);
    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++)
    if ((itmr != tmr) && (rtc_hz[itmr] != 0))
        rtc_currd[itmr] = (rtc_currd[tmr] * ticksper) / rtc_hz[itmr];
AIO_SET_INTERRUPT_LATENCY(rtc_currd[tmr] * ticksper);   /* set interrrupt latency */
return rtc_currd[tmr];
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 (int32 ticksper)
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];
    sim_timer_units[tmr].action = &sim_timer_tick_svc;
    sim_timer_units[tmr].flags = UNIT_DIS | UNIT_IDLE;
    sim_clock_cosched_queue[tmr] = QUEUE_LIST_END;
    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 */

clock_last = clock_start = sim_os_msec ();
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
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
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);
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 cycles/sec\n", sim_fmt_numeric (inst_per_sec));
    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);
    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" : 
                                                    (sim_clock_unit[calb_tmr] ? sim_uname(sim_clock_unit[calb_tmr]) : "")));
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 for clocks ticking faster than %d Hz\n", sim_catchup_ticks ? "Enabled" : "Disabled", sim_os_tick_hz);
if (sim_idle_calib_pct == 0)
    fprintf (st, "Calibration:                   Always\n");
    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);
    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[tmr])
    if (0 == rtc->initd)
        continue;
    
    if (sim_clock_unit[tmr]) {
    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(sim_clock_unit[tmr]), 
                                                    sim_uname(rtc->clock_unit), 
                                                    (tmr == SIM_NTIMERS) ? ")" : "");
        }

    fprintf (st, "%s%sTimer %d:\n", sim_asynch_timer ? "Asynchronous " : "", rtc_hz[tmr] ? "Calibrated " : "Uncalibrated ", tmr);
    if (rtc_hz[tmr]) {
        fprintf (st, "  Running at:                %d Hz\n", rtc_hz[tmr]);
        fprintf (st, "  Tick Size:                 %s\n", sim_fmt_secs (rtc_clock_tick_size[tmr]));
        fprintf (st, "  Ticks in current second:   %d\n",   rtc_ticks[tmr]);
    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[tmr]), sim_fmt_secs ((double)rtc_elapsed[tmr]));
    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[tmr]));
        if (sim_idle_calib_pct)
            fprintf (st, "  Calib Skip Idle Thresh %%:  %u\n",   sim_idle_calib_pct);
        if (rtc_clock_calib_skip_idle[tmr])
            fprintf (st, "  Calibs Skip While Idle:    %u\n",   rtc_clock_calib_skip_idle[tmr]);
        if (rtc_clock_calib_backwards[tmr])
            fprintf (st, "  Calibs Skip Backwards:     %u\n",   rtc_clock_calib_backwards[tmr]);
        if (rtc_clock_calib_gap2big[tmr])
            fprintf (st, "  Calibs Skip Gap Too Big:   %u\n",   rtc_clock_calib_gap2big[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[tmr])
        fprintf (st, "  Instruction Time:          %.0f\n", rtc_gtime[tmr]);
    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[tmr]);
        fprintf (st, "  Virtual Time:              %u\n",   rtc_vtime[tmr]);
        fprintf (st, "  Next Interval:             %s\n",   sim_fmt_numeric ((double)rtc_nxintv[tmr]));
        fprintf (st, "  Base Tick Delay:           %s\n",   sim_fmt_numeric ((double)rtc_based[tmr]));
        fprintf (st, "  Initial Insts Per Tick:    %s\n",   sim_fmt_numeric ((double)rtc_initd[tmr]));
        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[tmr]));
    fprintf (st, "  Initializations:           %d\n",   rtc_calib_initializations[tmr]);
    fprintf (st, "  Ticks:                     %s\n", sim_fmt_numeric ((double)(rtc_clock_ticks[tmr])));
    if (rtc_clock_ticks_tot[tmr]+rtc_clock_ticks[tmr] != rtc_clock_ticks[tmr])
        fprintf (st, "  Total Ticks:               %s\n", sim_fmt_numeric ((double)(rtc_clock_ticks_tot[tmr]+rtc_clock_ticks[tmr])));
    if (rtc_clock_skew_max[tmr] != 0.0)
        fprintf (st, "  Peak Clock Skew:           %s%s\n", sim_fmt_secs (fabs(rtc_clock_skew_max[tmr])), (rtc_clock_skew_max[tmr] < 0) ? " fast" : " slow");
    if (rtc_calib_ticks_acked[tmr])
        fprintf (st, "  Ticks Acked:               %s\n",   sim_fmt_numeric ((double)rtc_calib_ticks_acked[tmr]));
    if (rtc_calib_ticks_acked_tot[tmr]+rtc_calib_ticks_acked[tmr] != rtc_calib_ticks_acked[tmr])
        fprintf (st, "  Total Ticks Acked:         %s\n",   sim_fmt_numeric ((double)(rtc_calib_ticks_acked_tot[tmr]+rtc_calib_ticks_acked[tmr])));
    if (rtc_calib_tick_time[tmr])
        fprintf (st, "  Tick Time:                 %s\n",   sim_fmt_secs (rtc_calib_tick_time[tmr]));
    if (rtc_calib_tick_time_tot[tmr]+rtc_calib_tick_time[tmr] != rtc_calib_tick_time[tmr])
        fprintf (st, "  Total Tick Time:           %s\n",   sim_fmt_secs (rtc_calib_tick_time_tot[tmr]+rtc_calib_tick_time[tmr]));
    if (rtc_clock_catchup_ticks[tmr])
        fprintf (st, "  Catchup Ticks Sched:       %s\n",   sim_fmt_numeric ((double)rtc_clock_catchup_ticks[tmr]));
    if (rtc_clock_catchup_ticks_tot[tmr]+rtc_clock_catchup_ticks[tmr] != rtc_clock_catchup_ticks[tmr])
        fprintf (st, "  Total Catchup Ticks Sched: %s\n",   sim_fmt_numeric ((double)(rtc_clock_catchup_ticks_tot[tmr]+rtc_clock_catchup_ticks[tmr])));
    if (rtc_clock_init_base_time[tmr]) {
        _double_to_timespec (&now, rtc_clock_init_base_time[tmr]);
    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[tmr]) {
        _double_to_timespec (&now, rtc_clock_tick_start_time[tmr]);
    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 (rtc_clock_catchup_eligible[tmr]) {
        _double_to_timespec (&now, rtc_clock_catchup_base_time[tmr]+rtc_calib_tick_time[tmr]);
    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[tmr]);
        _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[tmr])
        fprintf (st, "  Total Time Idled:          %s\n",   sim_fmt_secs (rtc_clock_time_idled[tmr]/1000.0));
    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

1252


1253
1254

1255
1256
1257
1258

1259
1260

1261
1262
1263
1264
1265
1266
1267
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 (sim_clock_unit[tmr] == NULL)

    if (rtc->clock_unit == NULL)
        continue;
    if (sim_clock_cosched_queue[tmr] != QUEUE_LIST_END) {
    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(sim_clock_unit[tmr]));
                 sim_name, tmr, sim_uname(rtc->clock_unit));
        accum = 0;
        for (uptr = sim_clock_cosched_queue[tmr]; uptr != QUEUE_LIST_END; uptr = uptr->next) {
        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
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
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,      rtc_hz[0],              32, "Timer 0 Ticks Per Second") },
    { DRDATAD (TICK_SIZE_0,      rtc_currd[0],           32, "Timer 0 Tick Size") },
    { DRDATAD (TICK_RATE_1,      rtc_hz[1],              32, "Timer 1 Ticks Per Second") },
    { DRDATAD (TICK_SIZE_1,      rtc_currd[1],           32, "Timer 1 Tick Size") },
    { DRDATAD (TICK_RATE_2,      rtc_hz[2],              32, "Timer 2 Ticks Per Second") },
    { DRDATAD (TICK_SIZE_2,      rtc_currd[2],           32, "Timer 2 Tick Size") },
    { DRDATAD (TICK_RATE_3,      rtc_hz[3],              32, "Timer 3 Ticks Per Second") },
    { DRDATAD (TICK_SIZE_3,      rtc_currd[3],           32, "Timer 3 Tick Size") },
    { DRDATAD (TICK_RATE_4,      rtc_hz[4],              32, "Timer 4 Ticks Per Second") },
    { DRDATAD (TICK_SIZE_4,      rtc_currd[4],           32, "Timer 4 Tick Size") },
    { DRDATAD (TICK_RATE_5,      rtc_hz[5],              32, "Timer 5 Ticks Per Second") },
    { DRDATAD (TICK_SIZE_5,      rtc_currd[5],           32, "Timer 5 Tick Size") },
    { DRDATAD (TICK_RATE_6,      rtc_hz[6],              32, "Timer 6 Ticks Per Second") },
    { DRDATAD (TICK_SIZE_6,      rtc_currd[6],           32, "Timer 6 Tick Size") },
    { DRDATAD (TICK_RATE_7,      rtc_hz[7],              32, "Timer 7 Ticks Per Second") },
    { DRDATAD (TICK_SIZE_7,      rtc_currd[7],           32, "Timer 7 Tick Size") },
    { 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,rtc_currd[SIM_NTIMERS],32, "Internal Timer Tick Size") },
    { 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
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
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)
    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;
int32 newpct;
char gbuf[CBUFSIZE];

if (cptr == NULL)
    return SCPE_ARG;
if (1) {
    int32 newpct;
    char gbuf[CBUFSIZE];

cptr = get_glyph_nc (cptr, gbuf, 0);              /* get argument */
if (isdigit (gbuf[0]))
    newpct = (int32) get_uint (cptr, 10, 100, &r);
else {
    if (MATCH_CMD (gbuf, "ALWAYS") == 0)
        newpct = 0;
    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;
    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



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
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[tmr]) {                   /* Catchup clock tick pending? */
    sim_debug (DBG_CAL, &sim_timer_dev, "sim_idle(tmr=%d, sin_cyc=%d) - accelerating pending catch-up tick before idling %s\n", tmr, sin_cyc, sim_uname (sim_clock_unit[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[tmr] < sim_idle_stable)) {             /* or timer not stable? */
    sim_debug (DBG_IDL, &sim_timer_dev, "Can't idle: %s - elapsed: %d.%03d\n", !sim_idle_enab ? "idle disabled" : 
                                                                             ((rtc_elapsed[tmr] < sim_idle_stable) ? "not stable" : 
    (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[tmr], rtc_ticks[tmr]);
                                                                                                                                                            "")), rtc->elapsed, rtc->ticks, rtc->hz);
    sim_interval -= sin_cyc;
    return FALSE;
    }
if (_rtcn_tick_catchup_check(tmr, 0)) {
    sim_debug (DBG_CAL, &sim_timer_dev, "sim_idle(tmr=%d, sin_cyc=%d) - rescheduling catchup tick for %s\n", tmr, sin_cyc, sim_uname (sim_clock_unit[tmr]));
    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 will not 
   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 and sim_idle_calib_pct
   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[tmr] * rtc_hz[tmr]) / 1000;/* cycles per msec */
    sim_idle_cyc_ms = (rtc->currd * rtc->hz) / 1000;/* cycles per msec */
    if (sim_idle_rate_ms != 0)
        sim_idle_cyc_sleep = (rtc_currd[tmr] * rtc_hz[tmr]) / (1000 / sim_idle_rate_ms);/* cycles per sleep */
        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[tmr])
    w_idle = (sim_interval * 1000) / rtc_currd[tmr];    /* 1000 * pending fraction of tick */
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) {                                     /* shorter than 1/2 the interval? */
    sim_interval -= sin_cyc;
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 instructions\n", w_ms, sim_interval);
    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 instructions\n", w_ms, sim_uname(sim_clock_queue), sim_interval);
    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[tmr] += act_ms;
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 instructions\n", act_ms, sim_interval);
    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 instructions\n", act_ms, sim_uname(sim_clock_queue), sim_interval);
    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
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
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_INITIAL_IPS;
    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 megacycles\n", sim_throt_val);
        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 cycles\n", sim_throt_sleep_time, 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 kilocycles\n", sim_throt_val);
        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 cycles\n", sim_throt_sleep_time, 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 cycles per second\n", sim_throt_val, sim_fmt_numeric (sim_throt_peak_cps));
            fprintf (st, "Throttling by sleeping for:    %d ms every %d cycles\n", sim_throt_sleep_time, 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 cycles\n", sim_throt_sleep_time, sim_throt_val);
        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
1817
1818


1819
1820
1821
1822


1823
1824
1825
1826
1827


1828
1829
1830
1831
1832
1833
1834
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[sim_calb_tmr] != 0)) {
            if (rtc_calibrations[sim_calb_tmr] < sim_throt_delay) {
        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[sim_calb_tmr]));
                return sim_activate (uptr, rtc_hz[sim_calb_tmr]*rtc_currd[sim_calb_tmr]);
                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[sim_calb_tmr] * rtc_currd[sim_calb_tmr])) 
                sim_throt_peak_cps = (double)rtc_hz[sim_calb_tmr] * rtc_currd[sim_calb_tmr];
            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
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
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 instructions.\n", 
                                (int)delta_ms, delta_inst);
            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 instructions per second\n", sim_fmt_numeric(d_cps));
                sim_printf ("Host CPU can only simulate %s instructions per second\n", sim_fmt_numeric(sim_throt_peak_cps));
                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

1914
1915
1916
1917
1918
1919
1920
1921
1922









1923
1924
1925
1926
1927
1928
1929
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[tmr]) {                                      /* running? */
                    rtc_currd[tmr] = (int32)(sim_throt_cps / rtc_hz[tmr]);/* use throttle calibration */
                    rtc_ticks[tmr] = rtc_hz[tmr] - 1;                     /* force clock calibration on next tick */
                    rtc_rtime[tmr] = sim_throt_ms_start - 1000 + 1000/rtc_hz[tmr];/* adjust calibration parameters to reflect throttled rate */
                    rtc_gtime[tmr] = sim_throt_inst_start - sim_throt_cps + sim_throt_cps/rtc_hz[tmr];
                    rtc_nxintv[tmr] = 1000;
                    rtc_based[tmr] = rtc_currd[tmr];
                    if (sim_clock_unit[tmr])
                        sim_activate_abs (sim_clock_unit[tmr], rtc_currd[tmr]);/* reschedule next tick */
                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
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
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[tmr] += 1;
rtc_calib_tick_time[tmr] += rtc_clock_tick_size[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 (sim_clock_unit[tmr]), sim_cosched_interval[tmr]);
if (sim_clock_unit[tmr]->action == NULL)
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 = sim_clock_unit[tmr]->action (sim_clock_unit[tmr]);
--sim_cosched_interval[tmr];                    /* Countdown ticks */
if (sim_clock_cosched_queue[tmr] != QUEUE_LIST_END)
    sim_clock_cosched_queue[tmr]->time = sim_cosched_interval[tmr];
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)                               && 
    (sim_cosched_interval[tmr] <= 0)                &&
    (sim_clock_cosched_queue[tmr] != QUEUE_LIST_END)) {
    UNIT *sptr = sim_clock_cosched_queue[tmr];
    (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[tmr]) {      /* calibration started? */
    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[tmr]+rtc_clock_catchup_base_time[tmr]));
        skew = (_timespec_to_double(&now) - (rtc->calib_tick_time+rtc->clock_catchup_base_time));

        if (fabs(skew) > fabs(rtc_clock_skew_max[tmr]))
            rtc_clock_skew_max[tmr] = skew;
        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 = sim_clock_cosched_queue[tmr];
        sim_clock_cosched_queue[tmr] = cptr->next;
        if (sim_clock_cosched_queue[tmr] != QUEUE_LIST_END) {
            sim_clock_cosched_queue[tmr]->time += sim_cosched_interval[tmr];
            sim_cosched_interval[tmr] = sim_clock_cosched_queue[tmr]->time;
        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
            sim_cosched_interval[tmr]  = 0;
        } while ((sim_cosched_interval[tmr] <= 0) &&
                 (sim_clock_cosched_queue[tmr] != QUEUE_LIST_END));
            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
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
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
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:
        tmr =   calibrated timer to check/schedule
        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 (int32 tmr, int32 time)
static t_bool _rtcn_tick_catchup_check (RTC *rtc, int32 time)
{
int32 tmr;
t_bool bReturn = FALSE;

if ((!sim_catchup_ticks) || 
if (!sim_catchup_ticks)
    ((tmr < 0) || (tmr >= SIM_NTIMERS)))
    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 ((rtc_hz[tmr] > sim_os_tick_hz) &&           /* faster than host tick */
    (!rtc_clock_catchup_eligible[tmr]) &&       /* not eligible yet? */

            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[tmr] = sim_timenow_double();
    rtc_clock_ticks_tot[tmr] += rtc_clock_ticks[tmr];
    rtc_clock_ticks[tmr] = 0;
    rtc_calib_tick_time_tot[tmr] += rtc_calib_tick_time[tmr];
    rtc_calib_tick_time[tmr] = 0.0;
    rtc_clock_catchup_ticks_tot[tmr] += rtc_clock_catchup_ticks[tmr];
    rtc_clock_catchup_ticks[tmr] = 0;
    rtc_calib_ticks_acked_tot[tmr] += rtc_calib_ticks_acked[tmr];
    rtc_calib_ticks_acked[tmr] = 0;
    rtc_clock_catchup_eligible[tmr] = TRUE;
    sim_debug (DBG_QUE, &sim_timer_dev, "_rtcn_tick_catchup_check() - Enabling catchup ticks for %s\n", sim_uname (sim_clock_unit[tmr]));
    return TRUE;
    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[tmr] > 0) && 
    rtc_clock_catchup_eligible[tmr])
if ((rtc->hz > 0) && 
    rtc->clock_catchup_eligible)
    {
    double tnow = sim_timenow_double();

    if (tnow > (rtc_clock_catchup_base_time[tmr] + (rtc_calib_tick_time[tmr] + rtc_clock_tick_size[tmr]))) {
        sim_debug (DBG_QUE, &sim_timer_dev, "_rtcn_tick_catchup_check(%d) - scheduling catchup tick for %s which is behind %s\n", time, sim_uname (sim_clock_unit[tmr]), sim_fmt_secs (tnow > (rtc_clock_catchup_base_time[tmr] + (rtc_calib_tick_time[tmr] + rtc_clock_tick_size[tmr]))));
        rtc_clock_catchup_pending[tmr] = TRUE;
        sim_activate_abs (&sim_timer_units[tmr], (time < 0) ? 0 : time);
    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 FALSE;
return bReturn;
}

t_stat sim_rtcn_tick_ack (uint32 time, int32 tmr)
{
RTC *rtc;

if ((tmr < 0) || (tmr >= SIM_NTIMERS))
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 (sim_clock_unit[tmr]));
_rtcn_tick_catchup_check (tmr, (int32)time);
++rtc_calib_ticks_acked[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
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
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 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.
   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.
   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 10Hz.
   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++) {
    if ((rtc_hz[tmr]) &&
        (rtc_hz[tmr] <= (uint32)sim_os_tick_hz) &&
        (sim_clock_unit[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? */
            (!rtc_hz[sim_calb_tmr])) {      /* 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(sim_clock_unit[sim_calb_tmr]));
            /* 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 */
            rtc_hz[sim_calb_tmr] = rtc_last_hz[sim_calb_tmr];
            while (sim_clock_cosched_queue[sim_calb_tmr] != QUEUE_LIST_END) {
                UNIT *uptr = sim_clock_cosched_queue[sim_calb_tmr];
                double usecs_remaining = sim_timer_activate_time_usecs (uptr) - 1;
            (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;
                }
            rtc_hz[sim_calb_tmr] = 0;                           /* back to 0 */
            if (sim_clock_unit[sim_calb_tmr])
                sim_cancel (sim_clock_unit[sim_calb_tmr]);
            sim_cancel (&sim_timer_units[sim_calb_tmr]);
                    _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 (&SIM_INTERNAL_UNIT, (CLK_INIT*CLK_TPS)/sim_int_clk_tps, SIM_INTERNAL_CLK);
        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[tmr]);
    rtc_initd[SIM_NTIMERS] = 0;
    rtc_hz[SIM_NTIMERS] = 0;
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) &&
        (rtc_hz[sim_calb_tmr] == 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 */
        rtc_hz[sim_calb_tmr] = rtc_last_hz[sim_calb_tmr];
        while (sim_clock_cosched_queue[tmr] != QUEUE_LIST_END) {
            UNIT *uptr = sim_clock_cosched_queue[tmr];
            double usecs_remaining = sim_timer_activate_time_usecs (uptr) - 1;
    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;
            }
        rtc_hz[sim_calb_tmr] = 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, rtc_hz[sim_calb_tmr], tmr, rtc_hz[tmr]);
                _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



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
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;
/* 
 * If we're quickly running again after being stopped for less than
 * the time of one calibrated clock tick, then don't force a complete 

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? */
 * recalibration of any timers that may have been previously running.
 */
if ((sim_calb_tmr_last != -1) && 
    ((sim_timenow_double () - sim_stop_time) < rtc_clock_tick_size[sim_calb_tmr_last])) {
    int32 clock_time = sim_activate_time (sim_clock_unit[sim_calb_tmr_last]);

    sim_calb_tmr = sim_calb_tmr_last;
    sim_cancel (sim_clock_unit[sim_calb_tmr]);
        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_activate (&sim_timer_units[sim_calb_tmr], clock_time);
    sim_debug (DBG_TRC, &sim_timer_dev, "sim_start_timer_services() - restarting with previously calibrated timer %d (%s) at %d\n", sim_calb_tmr, sim_uname (sim_clock_unit[sim_calb_tmr]), clock_time);
    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_TRC, &sim_timer_dev, "sim_start_timer_services() - starting from scratch\n");
        sim_debug (DBG_CAL, &sim_timer_dev, "sim_start_timer_services() - restarting internal timer after %d %s\n", 
    sim_rtcn_init_all ();                                   /* re-init clocks */
    _rtcn_configure_calibrated_clock (sim_calb_tmr);
                                            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
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
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)\n", sim_interval);
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 (sim_clock_unit[tmr]) {
        int32 clock_time = _sim_activate_time (&sim_timer_units[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 (&sim_timer_units[tmr])) {
            sim_cancel (&sim_timer_units[tmr]);
            sim_debug (DBG_QUE, &sim_timer_dev, "sim_stop_timer_services() - tmr=%d scheduling %s after %d\n", tmr, sim_uname (sim_clock_unit[tmr]), clock_time);
            _sim_activate (sim_clock_unit[tmr], clock_time);
        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 = sim_cosched_interval[tmr];
        while (sim_clock_cosched_queue[tmr] != QUEUE_LIST_END) {
            UNIT *cptr = sim_clock_cosched_queue[tmr];
        accum = rtc->cosched_interval;
        while (rtc->clock_cosched_queue != QUEUE_LIST_END) {
            UNIT *cptr = rtc->clock_cosched_queue;
            double usecs_remaining = cptr->usecs_remaining;

            sim_clock_cosched_queue[tmr] = cptr->next;
            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[tmr]);
            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);
            }
        sim_cosched_interval[tmr] = 0;
        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_calb_tmr = -1;
sim_stop_time = sim_timenow_double ();              /* record when execution stopped */
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

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
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[sim_calb_tmr])*rtc_hz[sim_calb_tmr];
inst_per_sec = ((double)rtc->currd) * rtc->hz;
if (inst_per_sec == 0.0)
    inst_per_sec = ((double)rtc_currd[sim_calb_tmr])*sim_int_clk_tps;
    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++)
    if (sim_clock_unit[tmr] == uptr) {
        uptr = &sim_timer_units[tmr];
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


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
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 ((sim_calb_tmr != -1) && (rtc_hz[sim_calb_tmr])) {       /* Calibrated Timer available? */
    int32 inst_til_tick = sim_activate_time (&sim_timer_units[sim_calb_tmr]) - 1;
    int32 ticks_til_calib = rtc_hz[sim_calb_tmr] - rtc_ticks[sim_calb_tmr];
    double usecs_per_tick = floor (1000000.0 / rtc_hz[sim_calb_tmr]);
    int32 inst_til_calib = inst_til_tick + ((ticks_til_calib - 1) * rtc_currd[sim_calb_tmr]);
    uint32 usecs_til_calib = (uint32)ceil(inst_til_calib / inst_per_usec);
    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 != &sim_timer_units[sim_calb_tmr]) &&         /* 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);
        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;
                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


2670
2671


2672
2673
2674
2675
2676
2677
2678
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];

        sim_clock_unit[tmr]->cancel = &_sim_wallclock_cancel;
        sim_clock_unit[tmr]->a_is_active = &_sim_wallclock_is_active;
        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
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
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 (sim_clock_cosched_queue[tmr] != QUEUE_LIST_END) {
        UNIT *uptr = sim_clock_cosched_queue[tmr];
    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 (sim_clock_unit[tmr]) {
        sim_cancel (sim_clock_unit[tmr]);
        sim_clock_unit[tmr]->dynflags &= ~UNIT_TMR_UNIT;
    if (rtc->clock_unit) {
        sim_cancel (rtc->clock_unit);
        rtc->clock_unit->dynflags &= ~UNIT_TMR_UNIT;
        }
    sim_clock_unit[tmr] = NULL;
    sim_cancel (&sim_timer_units[tmr]);
    rtc->clock_unit = NULL;
    sim_cancel (rtc->timer_unit);
    return SCPE_OK;
    }
if (NULL == sim_clock_unit[tmr])
    sim_clock_cosched_queue[tmr] = QUEUE_LIST_END;
sim_clock_unit[tmr] = uptr;
if (rtc->clock_unit == NULL)
    rtc->clock_cosched_queue = QUEUE_LIST_END;
rtc->clock_unit = uptr;
uptr->dynflags |= UNIT_TMR_UNIT;
sim_timer_units[tmr].flags = ((tmr == SIM_NTIMERS) ? 0 : UNIT_DIS) | 
                             (sim_clock_unit[tmr] ? UNIT_IDLE : 0);
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 ((rtc_currd[0] && rtc_hz[0]) ? 0 : ((sim_calb_tmr != -1) ? sim_calb_tmr : 0));
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[tmr]) ? rtc_currd[tmr] : 10000;

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

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
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 == sim_clock_unit[tmr]) || (rtc_hz[tmr] == 0)) {
    sim_debug (DBG_TIM, &sim_timer_dev, "sim_clock_coschedule_tmr(%s, tmr=%d, ticks=%d) - no clock activating after %d instructions\n", sim_uname (uptr), tmr, ticks, ticks * (rtc_currd[tmr] ? rtc_currd[tmr] : rtc_currd[sim_rtcn_calibrated_tmr ()]));
    return sim_activate (uptr, ticks * (rtc_currd[tmr] ? rtc_currd[tmr] : rtc_currd[sim_rtcn_calibrated_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 (sim_clock_cosched_queue[tmr] != QUEUE_LIST_END)
        sim_clock_cosched_queue[tmr]->time = sim_cosched_interval[tmr];
    if (rtc->clock_cosched_queue != QUEUE_LIST_END)
        rtc->clock_cosched_queue->time = rtc->cosched_interval;
    prvptr = NULL;
    accum = 0;
    for (cptr = sim_clock_cosched_queue[tmr]; cptr != QUEUE_LIST_END; cptr = cptr->next) {
    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 = sim_clock_cosched_queue[tmr];
        sim_clock_cosched_queue[tmr] = uptr;
        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 == sim_clock_cosched_queue[tmr])
        sim_cosched_interval[tmr] = sim_clock_cosched_queue[tmr]->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[tmr], sim_cosched_interval[tmr]);
    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 (sim_clock_unit[tmr]) {
            if (uptr == sim_clock_cosched_queue[tmr]) {
                nptr = sim_clock_cosched_queue[tmr] = uptr->next;
        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 = sim_clock_cosched_queue[tmr];
                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

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
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 (sim_clock_unit[tmr] == uptr)

    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 (sim_clock_unit[tmr] == uptr)

    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++)
    if (sim_clock_unit[tmr] == uptr) {
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


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
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];

            sim_clock_unit[tmr]->cancel = NULL;
            sim_clock_unit[tmr]->a_is_active = NULL;
            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++)
    if (sim_clock_unit[tmr] == uptr)
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

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
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 = sim_clock_cosched_queue[tmr]; cptr != QUEUE_LIST_END; cptr = cptr->next) {
            if (cptr == sim_clock_cosched_queue[tmr]) {
                if (sim_cosched_interval[tmr] > 0)
                    accum += sim_cosched_interval[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[tmr] * accum) + sim_activate_time (&sim_timer_units[tmr]);
                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 (sim_clock_unit[tmr] == uptr) {

    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
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
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 = sim_clock_cosched_queue[tmr]; cptr != QUEUE_LIST_END; cptr = cptr->next) {
            if (cptr == sim_clock_cosched_queue[tmr]) {
                if (sim_cosched_interval[tmr] > 0)
                    accum += sim_cosched_interval[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[tmr] * 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[tmr], accum, sim_activate_time (&sim_timer_units[tmr]) - 1, uptr->usecs_remaining);
                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 == sim_clock_unit[tmr]) && (uptr->next)) {
        result = sim_clock_unit[tmr]->usecs_remaining + (1000000.0 * (sim_activate_time (&sim_timer_units[tmr]) - 1)) / sim_timer_inst_per_sec ();
    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





























































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;
}
Changes to src/SIMH/sim_timer.h.
72
73
74
75
76
77
78
79

80

81
82
83
84
85
86
87
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 500000                      /* uncalibrated assumption */
#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

114

115
116

117
118
119
120
121
122
123
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 (int32 ticksper, int32 tmr);
int32 sim_rtcn_calb_tick (int32 tmr);
int32 sim_rtc_init (int32 time);
int32 sim_rtc_calb (int32 ticksper);
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
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
Changes to src/SIMH/sim_tmxr.c.
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
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}
        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}
        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}
        sim> attach MX Connect=host:port{;notelnet}|{;nomessage}

     The command syntax for ANY multi-line device is:

        sim> attach MX port{;notelnet}              ; 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}       ; 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 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
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
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
        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

   A line which is connected to a serial port can be manually closed by
   adding the -C switch to a disconnect command.

     sim> set -C 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
525

526
527
528
529
530
531
532
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) || (sim_switches & SWMASK ('V'))) {
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
586

587
588
589
590
591
592
593
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)
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
876




877
878
879
880
881
882
883
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, 13 + strlen (mp->port)), "%s%s", mp->port, mp->notelnet ? ";notelnet" : "");
    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

946


947
948
949
950
951
952
953
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, 
        sprintf (growstring(&tptr, 12 + strlen (lp->port)), ",%s%s", lp->port, ((lp->mp->notelnet != lp->notelnet) && (!lp->datagram)) ? (lp->notelnet ? ";notelnet" : ";telnet") : "");
                                                                       ((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
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

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
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 && 
if ((poll_time - mp->last_poll_time) < mp->poll_interval*1000)
    ((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? */
        sprintf (msg, "tmxr_poll_conn() - Connection from %s", address);
        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
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
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
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);
                            sprintf (msg, "tmxr_poll_conn() - Outgoing Line Connection to %s (%s->%s) established", lp->destination, 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 */
                            sprintf (msg, "tmxr_poll_conn() - Outgoing Line Connection to %s failed", lp->destination);
                            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);
                        sprintf (msg, "tmxr_poll_conn() - Incoming Line Connection from %s (%s->%s)", address, peername, sockname);
                        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[CBUFSIZE];
                            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");
                                sprintf (msg, "tmxr_poll_conn() - Rejecting line connection from: %s, Expected: %s", address, host);
                                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) {
                                sprintf (msg, "tmxr_poll_conn() - aborting outgoing line connection attempt to: %s", lp->destination);
                                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
1289

1290
1291


1292
1293
1294
1295
1296
1297
1298
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))) {
        sprintf (msg, "tmxr_poll_conn() - establishing outgoing connection to: %s", lp->destination);
        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));
        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
1361


1362
1363
1364
1365
1366
1367
1368
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));
        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
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
1533
1534
1535



1536
1537
1538
1539
1540
1541
1542
1543
1544

1545
1546
1547
1548
1549
1550
1551
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:
        incoming_bits   if non NULL, returns the current stat of DCD, 
                        RNG, CTS and DSR along with the current state
                        of DTR and RTS
        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 *incoming_bits)
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
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
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
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 (incoming_bits)
    *incoming_bits = lp->modembits;
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) {              /* Anything to do? */
    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)
            return sim_control_serial (lp->serport, bits_to_set, bits_to_clear, incoming_bits);
        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));
                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, incoming_bits);
    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
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
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->txbfd && !lp->notelnet) || (TXBUF_AVAIL(lp) > 1)) {/* room for char (+ IAC)? */
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? */
    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 : 
                        10);                           /* wait an approximate character delay */
                        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
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
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, modem_control, loopback, datagram, packet, disabled;
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 = notelnet = listennotelnet = loopback = disabled = FALSE;
    nolog = loopback = disabled = FALSE;
    datagram = mp->datagram;
    packet = mp->packet;
    if (mp->buffered)
        sprintf(buffered, "%d", mp->buffered);
    if (line != -1)
    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
2698

2699
2700
2701
2702
2703
2704
2705
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);
                notelnet = datagram = TRUE;
                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
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
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);
            if (cptr) {
            while (cptr && *cptr) {
                char *tptr = gbuf + (cptr - gbuf);

                get_glyph (cptr, tptr, 0);                  /* upcase this string */
                if (0 == MATCH_CMD (cptr, "NOTELNET"))
                cptr = get_glyph (cptr, tptr, ';');
                if (0 == MATCH_CMD (tptr, "NOTELNET"))
                    listennotelnet = TRUE;
                else
                    if (0 == MATCH_CMD (cptr, "TELNET"))
                    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);
                                    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, ';');
        if (option[0]) {
        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);
                            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
2801
2802


2803
2804


2805
2806
2807
2808
2809
2810
2811
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);
                        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));
            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
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
2956


2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969

2970
2971
2972
2973
2974
2975
2976
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));
                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
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
3071


3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083

3084
3085
3086
3087
3088
3089
3090
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));
                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
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
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
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
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
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
4565

4566
4567
4568
4569

4570
4571
4572
4573
4574
4575
4576
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}\n\n", dptr->name);
    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}\n\n", dptr->name);
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
4611
4612
4613






4614
4615
4616
4617
4618
4619
4620
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, "A line which is connected to a serial port can be manually closed by\n");
            fprintf (st, "adding the -C switch to a %s command.\n\n", mptr->mstring);
            fprintf (st, "   sim> SET -C %s %s=n\n\n", dptr->name, mptr->mstring);
            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
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
4848

4849
4850
4851
4852
4853
4854
4855
4856
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.  If the sim_switches -C flag is set, then a serial port 
   be raised again.
   connection will be closed.

   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
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
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)
    if ((!lp->notelnet) && (!lp->nomessage))
        tmxr_linemsg (lp, "\r\nOperator disconnected line\r\n\n");/* report closure */
    if (lp->serport && (sim_switches & SWMASK ('C')))
        return tmxr_detach_ln (lp);
    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 */
sim_open_logfile (cptr, TRUE, &lp->txlog, &lp->txlogref);/* open log */
if (lp->txlog == NULL) {                                /* error? */
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




























































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;
}
Changes to src/SIMH/sim_tmxr.h.
142
143
144
145
146
147
148

149
150
151
152
153
154
155
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
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
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
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)
Changes to src/SIMH/sim_video.c.
26
27
28
29
30
31
32
33

34
35
36
37
38
39



40
41
42
43
44
45



































46
47
48
49
50
51
52
53







54
55
56
57
58
59
60
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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"

t_bool vid_active = FALSE;
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
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
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
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 (void);
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);
/* 
   libSDL and libSDL2 have significantly different APIs.  
static void vid_beep_cleanup (void);
static void vid_controllers_setup (DEVICE *dptr);
   The consequence is that this code has significant #ifdef sections.

static void vid_controllers_cleanup (void);
   The current structure is to implement the API differences in each 
   routine that has a difference.  This allows the decision and flow 
   logic to exist once and thus to allow logic changes to be implemented 
   in one place.

 */


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];
static void vid_beep_setup (int duration_ms, int tone_frequency);
static void vid_beep_cleanup (void);
#if SDL_MAJOR_VERSION == 1

/*
   Some platforms that use X11 display technology have libSDL 
   environments which need to call XInitThreads when libSDL is used
   in multi-threaded programs.  This routine attempts to locate
   the X11 shareable library and if it is found loads it and calls
   the XInitThreads routine to meet this requirement.
 */
#ifdef HAVE_DLOPEN
#include <dlfcn.h>
#endif

static void _XInitThreads (void)
{
#ifdef HAVE_DLOPEN
static void *hLib = NULL;                   /* handle to Library */
#define __STR_QUOTE(tok) #tok
#define __STR(tok) __STR_QUOTE(tok)
static const char* lib_name = "libX11." __STR(HAVE_DLOPEN);
typedef int (*_func)();
_func _func_ptr = NULL;

if (!hLib)
    hLib = dlopen(lib_name, RTLD_NOW);
if (hLib)
    _func_ptr = (_func)((size_t)dlsym(hLib, "XInitThreads"));
if (_func_ptr)
    _func_ptr();
#endif
}

t_bool vid_key_state[SDLK_LAST];
SDL_Surface *vid_image;                                 /* video buffer */
SDL_Surface *vid_window;                                /* window handle */
#else
t_bool vid_key_state[SDL_NUM_SCANCODES];
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;
};
#endif

SDL_Thread *vid_thread_handle = NULL;                   /* event thread handle */
SDL_Cursor *vid_cursor = NULL;                          /* current cursor */
t_bool vid_cursor_visible = FALSE;                      /* cursor visibility state */

static VID_DISPLAY vid_first;

KEY_EVENT_QUEUE vid_key_events;                         /* keyboard events */
MOUSE_EVENT_QUEUE vid_mouse_events;                     /* mouse events */
DEVICE *vid_dev;

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
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
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;

#if SDL_MAJOR_VERSION == 1
_XInitThreads();
status = SDL_Init (SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE);

vid_main_thread_handle = SDL_CreateThread (main_thread , NULL);
#else
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);
#endif

if (status) {
    fprintf (stderr, "SDL Video subsystem can't initialize\n");
if (vid_main_thread_handle == NULL) {
    fprintf (stderr, "SDL_CreateThread failed: %s\n", SDL_GetError ());
    exit (1);
    }

sim_os_set_thread_priority (PRIORITY_ABOVE_NORMAL);
vid_beep_setup (400, 660);

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_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 {
                        if (event.user.code == EVENT_BEEP)
                            vid_beep_event ();
                        else {
                            sim_printf ("main(): Unexpected User event: %d\n", event.user.code);
                            break;
                        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 ()
static t_stat vid_create_window (VID_DISPLAY *vptr)
{
int wait_count = 0;
SDL_Event user_event;

vid_ready = FALSE;
vptr->vid_ready = FALSE;
user_event.type = SDL_USEREVENT;
user_event.user.code = EVENT_OPEN;
user_event.user.data1 = NULL;
user_event.user.data1 = vptr;
user_event.user.data2 = NULL;
SDL_PushEvent (&user_event);

while ((!vid_ready) && (++wait_count < 20))
while ((!vptr->vid_ready) && (++wait_count < 20))
    sim_os_ms_sleep (100);
if (!vid_ready) {
if (!vptr->vid_ready) {
    vid_close ();
    return SCPE_OPENERR;
    }
return SCPE_OK;
}
#else
static int vid_create_window ()
static int vid_create_window (VID_DISPLAY *vptr)
{
int wait_count = 0;

#if SDL_MAJOR_VERSION == 1
vid_thread_handle = SDL_CreateThread (vid_thread, NULL);
#else
vid_thread_handle = SDL_CreateThread (vid_thread, "vid-thread", NULL);
#endif
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 ((!vid_ready) && (++wait_count < 20))
while ((!vptr->vid_ready) && (++wait_count < 20))
    sim_os_ms_sleep (100);
if (!vid_ready) {
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;
t_stat vid_open (DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags)
{
if (!vid_active) {
    int wait_count = 0;
    t_stat stat;

    if ((strlen(sim_name) + 7 + (dptr ? strlen (dptr->name) : 0) + (title ? strlen (title) : 0)) < sizeof (vid_title))
        sprintf (vid_title, "%s%s%s%s%s", sim_name, dptr ? " - " : "", dptr ? dptr->name : "", title ? " - " : "", title ? title : "");

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 (vid_title, "%s", sim_name);
    vid_flags = flags;
    vid_active = TRUE;
    vid_width = width;
    vid_height = height;
    vid_mouse_captured = FALSE;
    vid_cursor_visible = (vid_flags & SIM_VID_INPUTCAPTURED);
    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);

    vid_dev = dptr;
}

vptr->vid_dev = dptr;

memset (motion_callback, 0, sizeof motion_callback);
memset (button_callback, 0, sizeof button_callback);

    stat = vid_create_window ();
    if (stat != SCPE_OK)
        return stat;
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, vid_dev, "vid_open() - Success\n");
    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_active) {
    SDL_Event user_event;
    int status;

    vid_active = FALSE;
    if (vid_ready) {
if (vid_first.vid_active_window)
    return vid_close_window (&vid_first);
return SCPE_OK;
}

t_stat vid_close_all (void)
        sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE, vid_dev, "vid_close()\n");
        user_event.type = SDL_USEREVENT;
        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);
        vid_dev = NULL;
VID_DISPLAY *vptr;
vid_close ();
        }
    if (vid_thread_handle) {
        SDL_WaitThread (vid_thread_handle, &status);
        vid_thread_handle = NULL;
for (vptr = vid_first.next; vptr != NULL; vptr = vptr->next)
        }
    while (vid_ready)
    vid_close_window (vptr);
        sim_os_ms_sleep (10);
    if (vid_mouse_events.sem) {
        SDL_DestroySemaphore(vid_mouse_events.sem);
        vid_mouse_events.sem = NULL;
        }
    if (vid_key_events.sem) {
        SDL_DestroySemaphore(vid_key_events.sem);
        vid_key_events.sem = NULL;
        }
    }
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
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
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, vid_dev, "vid_poll_mouse: ignoring bouncing events\n");
            sim_debug (SIM_VID_DBG_MOUSE, ev->dev, "vid_poll_mouse: ignoring bouncing events\n");
            }
        }
    if (SDL_SemPost (vid_mouse_events.sem))
        sim_printf ("%s: vid_poll_mouse(): SDL_SemPost error: %s\n", sim_dname(vid_dev), SDL_GetError());
        sim_printf ("vid_poll_mouse(): SDL_SemPost error: %s\n", SDL_GetError());
    }
return stat;
}

uint32 vid_map_rgb (uint8 r, uint8 g, uint8 b)
uint32 vid_map_rgb_window (VID_DISPLAY *vptr, uint8 r, uint8 g, uint8 b)
{
#if SDL_MAJOR_VERSION == 1
return SDL_MapRGB (vid_image->format, r, g, b);
#else
return SDL_MapRGB (vid_format, r, g, 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);
#endif
}

void vid_draw (int32 x, int32 y, int32 w, int32 h, uint32 *buf)
uint32 vid_map_rgba_window (VID_DISPLAY *vptr, uint8 r, uint8 g, uint8 b, uint8 a)
{
#if SDL_MAJOR_VERSION == 1
return SDL_MapRGBA (vptr->vid_format, r, g, b, a);
int32 i;
uint32* pixels;

sim_debug (SIM_VID_DBG_VIDEO, vid_dev, "vid_draw(%d, %d, %d, %d)\n", x, y, w, h);
}

static SDL_Rect *vid_dst_last;
static uint32 *vid_data_last;

pixels = (uint32 *)vid_image->pixels;

void vid_draw_window (VID_DISPLAY *vptr, int32 x, int32 y, int32 w, int32 h, uint32 *buf)
{
for (i = 0; i < h; i++)
    memcpy (pixels + ((i + y) * vid_width) + x, buf + w*i, w*sizeof(*pixels));
#else
SDL_Event user_event;
SDL_Rect *vid_dst;
uint32 *vid_data;

sim_debug (SIM_VID_DBG_VIDEO, vid_dev, "vid_draw(%d, %d, %d, %d)\n", x, y, w, h);
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_dev ? sim_dname(vid_dev) : "Video Device");
    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_dev ? sim_dname(vid_dev) : "Video Device");
    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_dev ? sim_dname(vid_dev) : "Video Device", SDL_GetError());
    sim_printf ("%s: vid_draw() SDL_PushEvent error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError());
    free (vid_dst);
    free (vid_data);
    }
}
#endif

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 (t_bool visible, uint32 width, uint32 height, uint8 *data, uint8 *mask, uint32 hot_x, uint32 hot_y)
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, vid_dev, "vid_set_cursor(%s, %d, %d) Setting New Cursor\n", visible ? "visible" : "invisible", width, height);
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, vid_dev, "Cursor:  ");
        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, vid_dev, "%c", mode[(((data[byte]>>bit)&1)<<1)|(mask[byte]>>bit)&1]);
            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, vid_dev, "\n");
        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_dev ? sim_dname(vid_dev) : "Video Device", SDL_GetError());
    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 (int32 x, int32 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 (vid_flags & SIM_VID_INPUTCAPTURED)
if (vptr->vid_flags & SIM_VID_INPUTCAPTURED)
    return;

if ((x_delta) || (y_delta)) {
    sim_debug (SIM_VID_DBG_CURSOR, vid_dev, "vid_set_cursor_position(%d, %d) - Cursor position changed\n", x, y);
    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, 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);
            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_dev ? sim_dname(vid_dev) : "Video Device", SDL_GetError());
            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_dev ? sim_dname(vid_dev) : "Video Device", SDL_GetError());
        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 (vid_cursor_visible) {
    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", sim_dname(vid_dev), SDL_GetError());
        sim_debug (SIM_VID_DBG_CURSOR, vid_dev, "vid_set_cursor_position() - Warp Queued\n");
            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, vid_dev, "vid_set_cursor_position() - Warp Skipped\n");
        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 (void)
void vid_refresh_window (VID_DISPLAY *vptr)
{
SDL_Event user_event;

sim_debug (SIM_VID_DBG_VIDEO, vid_dev, "vid_refresh() - Queueing Refresh Event\n");
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", sim_dname(vid_dev), SDL_GetError());
    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
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
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;
#if SDL_MAJOR_VERSION == 1
    case SDLK_KP0:
        return SIM_KEY_KP_INSERT;

    case SDLK_KP1:
        return SIM_KEY_KP_END;

    case SDLK_KP2:
        return SIM_KEY_KP_DOWN;

    case SDLK_KP3:
        return SIM_KEY_KP_PAGE_DOWN;

    case SDLK_KP4:
        return SIM_KEY_KP_LEFT;

    case SDLK_KP5:
        return SIM_KEY_KP_5;

    case SDLK_KP6:
        return SIM_KEY_KP_RIGHT;

    case SDLK_KP7:
        return SIM_KEY_KP_HOME;

    case SDLK_KP8:
        return SIM_KEY_KP_UP;

    case SDLK_KP9:
        return SIM_KEY_KP_PAGE_UP;
#else
    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
1009

1010
1011
1012
1013
1014
1015
1016
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;
#endif

    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
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
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;
#if SDL_MAJOR_VERSION != 1

    case SDLK_NUMLOCKCLEAR:
        return SIM_KEY_NUM_LOCK;
#endif

    case SDLK_CAPSLOCK:
        return SIM_KEY_CAPS_LOCK;
#if SDL_MAJOR_VERSION == 1

    case SDLK_SCROLLOCK:
        return SIM_KEY_SCRL_LOCK;
#else
    case SDLK_SCROLLLOCK:
        return SIM_KEY_SCRL_LOCK;
#endif

    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;
#if SDL_MAJOR_VERSION == 1
    case SDLK_RMETA:
        return SIM_KEY_ALT_R;

    case SDLK_LMETA:
        return SIM_KEY_WIN_L;
#else
    case SDLK_LGUI:
        return SIM_KEY_WIN_L;

    case SDLK_RGUI:
        return SIM_KEY_WIN_R;
#endif

#if SDL_MAJOR_VERSION == 1
    case SDLK_PRINT:
        return SIM_KEY_PRINT;
#else
    case SDLK_PRINTSCREEN:
        return SIM_KEY_PRINT;
#endif

    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 (vid_mouse_captured) {
if (vptr->vid_mouse_captured) {
    static const Uint8 *KeyStates = NULL;
    static int numkeys;

    if (!KeyStates)
#if SDL_MAJOR_VERSION == 1
        KeyStates = SDL_GetKeyState(&numkeys);
    if ((vid_flags & SIM_VID_INPUTCAPTURED) && 
        (event->state == SDL_PRESSED) && 
        KeyStates[SDLK_RSHIFT] && 
        (KeyStates[SDLK_LCTRL] || KeyStates[SDLK_RCTRL])) {
#else
        KeyStates = SDL_GetKeyboardState(&numkeys);
    if ((vid_flags & SIM_VID_INPUTCAPTURED) && 
    if ((vptr->vid_flags & SIM_VID_INPUTCAPTURED) && 
        (event->state == SDL_PRESSED) && 
        KeyStates[SDL_SCANCODE_RSHIFT] && 
        (KeyStates[SDL_SCANCODE_LCTRL] || KeyStates[SDL_SCANCODE_RCTRL])) {
#endif
        sim_debug (SIM_VID_DBG_KEY, vid_dev, "vid_key() - Cursor Release\n");
        sim_debug (SIM_VID_DBG_KEY, vptr->vid_dev, "vid_key() - Cursor Release\n");
#if SDL_MAJOR_VERSION == 1
        if (SDL_WM_GrabInput (SDL_GRAB_OFF) < 0)        /* relese cursor */
            sim_printf ("%s: vid_key(): SDL_WM_GrabInput error: %s\n", sim_dname(vid_dev), SDL_GetError());
        if (SDL_ShowCursor (SDL_ENABLE) < 0)            /* show cursor */
            sim_printf ("%s: vid_key(): SDL_ShowCursor error: %s\n", sim_dname(vid_dev), SDL_GetError());
#else
        if (SDL_SetRelativeMouseMode(SDL_FALSE) < 0)    /* release cursor, show cursor */
            sim_printf ("%s: vid_key(): SDL_SetRelativeMouseMode error: %s\n", sim_dname(vid_dev), SDL_GetError());
            sim_printf ("%s: vid_key(): SDL_SetRelativeMouseMode error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError());
#endif
        vid_mouse_captured = FALSE;
        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, 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));
        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 SDL_MAJOR_VERSION == 1
            if (!vid_key_state[event->keysym.sym]) {    /* Key was not down before */
                vid_key_state[event->keysym.sym] = TRUE;
#else
            if (!vid_key_state[event->keysym.scancode]) {/* Key was not down before */
                vid_key_state[event->keysym.scancode] = TRUE;
            if (!vptr->vid_key_state[event->keysym.scancode]) {/* Key was not down before */
                vptr->vid_key_state[event->keysym.scancode] = TRUE;
#endif
                ev.state = SIM_KEYPRESS_DOWN;
                }
            else
                ev.state = SIM_KEYPRESS_REPEAT;
            }
        else {
#if SDL_MAJOR_VERSION == 1
            vid_key_state[event->keysym.sym] = FALSE;
#else
            vid_key_state[event->keysym.scancode] = FALSE;
            vptr->vid_key_state[event->keysym.scancode] = FALSE;
#endif
            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, 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);
        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", sim_dname(vid_dev), SDL_GetError());
        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 ((!vid_mouse_captured) && (vid_flags & SIM_VID_INPUTCAPTURED))
if ((!vptr->vid_mouse_captured) && (vptr->vid_flags & SIM_VID_INPUTCAPTURED))
    return;

if (!sim_is_running)
    return;
if (!vid_cursor_visible)
if (!vptr->vid_cursor_visible)
    return;
sim_debug (SIM_VID_DBG_MOUSE, vid_dev, "Mouse Move Event: pos:(%d,%d) rel:(%d,%d) buttons:(%d,%d,%d)\n", 
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);
#if SDL_MAJOR_VERSION == 1
while (SDL_PeepEvents (&dummy_event, 1, SDL_GETEVENT, SDL_MOUSEMOTIONMASK)) {
#else
while (SDL_PeepEvents (&dummy_event, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION)) {
#endif
    /* 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, vid_dev, "Mouse Move Event: Additional Event Coalesced:pos:(%d,%d) rel:(%d,%d) buttons:(%d,%d,%d)\n", 
    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 (!vid_mouse_captured) {
    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, vid_dev, "Mouse Move Event: pos:(%d,%d) rel:(%d,%d) buttons:(%d,%d,%d) - Count: %d vid_cursor:(%d,%d)\n", 
    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, vid_dev, "Mouse Move Event: Coalesced into pending event: (%d,%d)\n", 
            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, vid_dev, "Mouse Move Event Discarded: Count: %d\n", vid_mouse_events.count);
        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", sim_dname(vid_dev), SDL_GetError());
        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 ((!vid_mouse_captured) && (vid_flags & SIM_VID_INPUTCAPTURED)) {
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, vid_dev, "vid_mouse_button() - Cursor Captured\n");
        sim_debug (SIM_VID_DBG_KEY, vptr->vid_dev, "vid_mouse_button() - Cursor Captured\n");
#if SDL_MAJOR_VERSION == 1
        SDL_WM_GrabInput (SDL_GRAB_ON);                     /* lock cursor to window */
        SDL_ShowCursor (SDL_DISABLE);                       /* hide cursor */
        SDL_WarpMouse (vid_width/2, vid_height/2);          /* back to center */
        SDL_PumpEvents ();
        while (SDL_PeepEvents (&dummy_event, 1, SDL_GETEVENT, SDL_MOUSEMOTIONMASK)) {};
#else
        if (SDL_SetRelativeMouseMode (SDL_TRUE) < 0)        /* lock cursor to window, hide cursor */
            sim_printf ("%s: vid_mouse_button(): SDL_SetRelativeMouseMode error: %s\n", sim_dname(vid_dev), SDL_GetError());
        SDL_WarpMouseInWindow (NULL, vid_width/2, vid_height/2);/* back to center */
            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)) {};
#endif
        vid_mouse_captured = TRUE;
        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, vid_dev, "Mouse Button Event: State: %d, Button: %d, (%d,%d)\n", event->state, event->button, event->x, event->y);
    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, vid_dev, "Mouse Button Event Discarded: Count: %d\n", vid_mouse_events.count);
        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", sim_dname(vid_dev), SDL_GetError());
        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;
}
void vid_update (void)

t_bool vid_is_fullscreen (void)
{
return vid_is_fullscreen_window (&vid_first);
}
SDL_Rect vid_dst;

vid_dst.x = 0;
vid_dst.y = 0;
vid_dst.w = vid_width;
vid_dst.h = vid_height;

sim_debug (SIM_VID_DBG_VIDEO, vid_dev, "Video Update Event: \n");

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 SDL_MAJOR_VERSION == 1
if (vptr->vid_blending)
if (SDL_BlitSurface (vid_image, NULL, vid_window, &vid_dst) < 0)
    sim_printf ("%s: vid_update(): SDL_BlitSurface error: %s\n", sim_dname(vid_dev), SDL_GetError());
SDL_UpdateRects (vid_window, 1, &vid_dst);
#else
if (SDL_RenderClear (vid_renderer))
    sim_printf ("%s: Video Update Event: SDL_RenderClear error: %s\n", sim_dname(vid_dev), SDL_GetError());
if (SDL_RenderCopy (vid_renderer, vid_texture, NULL, NULL))
    sim_printf ("%s: Video Update Event: SDL_RenderCopy error: %s\n", sim_dname(vid_dev), SDL_GetError());
SDL_RenderPresent (vid_renderer);
    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);
#endif
}

void vid_update_cursor (SDL_Cursor *cursor, t_bool visible)
    }
}

void vid_update_cursor (VID_DISPLAY *vptr, SDL_Cursor *cursor, t_bool visible)
{
if (!cursor)
    return;
sim_debug (SIM_VID_DBG_VIDEO, 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, vid_cursor);
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 SDL_MAJOR_VERSION == 1
if (visible)
    SDL_WarpMouse (vid_cursor_x, vid_cursor_y);/* sync position */
#else
if ((vid_window == SDL_GetMouseFocus ()) && visible)
if ((vptr->vid_window == SDL_GetMouseFocus ()) && visible)
    SDL_WarpMouseInWindow (NULL, vid_cursor_x, vid_cursor_y);/* sync position */
#endif
if ((vid_cursor != cursor) && (vid_cursor))
    SDL_FreeCursor (vid_cursor);
vid_cursor = cursor;
if ((vptr->vid_cursor != cursor) && (vptr->vid_cursor))
    SDL_FreeCursor (vptr->vid_cursor);
vptr->vid_cursor = cursor;
SDL_ShowCursor (visible);
vid_cursor_visible = visible;
vptr->vid_cursor_visible = visible;
}

void vid_warp_position (void)
void vid_warp_position (VID_DISPLAY *vptr)
{
sim_debug (SIM_VID_DBG_VIDEO, vid_dev, "Mouse Warp Event: Warp to: (%d,%d)\n", vid_cursor_x, vid_cursor_y);
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 ();
#if SDL_MAJOR_VERSION == 1
SDL_WarpMouse (vid_cursor_x, vid_cursor_y);
#else
SDL_WarpMouseInWindow (NULL, vid_cursor_x, vid_cursor_y);
#endif
SDL_PumpEvents ();
}

void vid_draw_region (SDL_UserEvent *event)
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, vid_dev, "Draw Region Event: (%d,%d,%d,%d)\n", vid_dst->x, vid_dst->x, vid_dst->w, vid_dst->h);
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);

#if SDL_MAJOR_VERSION == 1
if (1) {
    int32 i;
    uint32* pixels;

    pixels = (uint32 *)vid_image->pixels;
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);

    for (i = 0; i < vid_dst->h; i++)
        memcpy (pixels + ((i + vid_dst->y) * vid_width) + vid_dst->x, buf + vid_dst->w*i, vid_dst->w*sizeof(*pixels));
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(vid_texture, vid_dst, buf, vid_dst->w*sizeof(*buf)))
    sim_printf ("%s: vid_draw() - SDL_UpdateTexture error: %s\n", sim_dname(vid_dev), SDL_GetError());
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());
#endif

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 (void)
int vid_video_events (VID_DISPLAY *vptr0)
{
SDL_Event event;
#if SDL_MAJOR_VERSION == 1
static const char *eventtypes[] = {
    "NOEVENT",              /**< Unused (do not remove) */
    "ACTIVEEVENT",          /**< Application loses/gains visibility */
    "KEYDOWN",              /**< Keys pressed */
    "KEYUP",                /**< Keys released */
    "MOUSEMOTION",          /**< Mouse moved */
    "MOUSEBUTTONDOWN",      /**< Mouse button pressed */
    "MOUSEBUTTONUP",        /**< Mouse button released */
    "JOYAXISMOTION",        /**< Joystick axis motion */
    "JOYBALLMOTION",        /**< Joystick trackball motion */
    "JOYHATMOTION",         /**< Joystick hat position change */
    "JOYBUTTONDOWN",        /**< Joystick button pressed */
    "JOYBUTTONUP",          /**< Joystick button released */
    "QUIT",                 /**< User-requested quit */
    "SYSWMEVENT",           /**< System specific event */
    "EVENT_RESERVEDA",      /**< Reserved for future use.. */
    "EVENT_RESERVEDB",      /**< Reserved for future use.. */
    "VIDEORESIZE",          /**< User resized video mode */
    "VIDEOEXPOSE",          /**< Screen needs to be redrawn */
    "EVENT_RESERVED2",      /**< Reserved for future use.. */
    "EVENT_RESERVED3",      /**< Reserved for future use.. */
    "EVENT_RESERVED4",      /**< Reserved for future use.. */
    "EVENT_RESERVED5",      /**< Reserved for future use.. */
    "EVENT_RESERVED6",      /**< Reserved for future use.. */
    "EVENT_RESERVED7",      /**< Reserved for future use.. */
    "USEREVENT",            /** Events SDL_USEREVENT(24) through SDL_MAXEVENTS-1(31) are for your use */
    "",
    "",
    "",
    "",
    "",
    "",
    ""
    };
#else
static const char *eventtypes[SDL_LASTEVENT];
#endif
static const char *windoweventtypes[256];
static t_bool initialized = FALSE;

if (!initialized) {
    initialized = TRUE;
#if SDL_MAJOR_VERSION != 1

    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
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
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";
#endif  /* SDL_MAJOR_VERSION != 1 */
    }

sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE, vid_dev, "vid_thread() - Starting\n");
sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE, vptr0->vid_dev, "vid_thread() - Starting\n");

memset (&vid_key_state, 0, sizeof(vid_key_state));

sim_os_set_thread_priority (PRIORITY_ABOVE_NORMAL);
#if SDL_MAJOR_VERSION == 1
vid_window = SDL_SetVideoMode (vid_width, vid_height, 8, 0);

SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);

if (sim_end)
    vid_image = SDL_CreateRGBSurface (SDL_SWSURFACE, vid_width, vid_height, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
else
    vid_image = SDL_CreateRGBSurface (SDL_SWSURFACE, vid_width, vid_height, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);

#else
SDL_CreateWindowAndRenderer (vid_width, vid_height, SDL_WINDOW_SHOWN, &vid_window, &vid_renderer);

if ((vid_window == NULL) || (vid_renderer == NULL)) {
    sim_printf ("%s: Error Creating Video Window: %s\n", sim_dname(vid_dev), SDL_GetError());
    SDL_Quit ();
    return 0;
    }

SDL_SetRenderDrawColor (vid_renderer, 0, 0, 0, 255);
SDL_RenderClear (vid_renderer);
SDL_RenderPresent (vid_renderer);

vid_texture = SDL_CreateTexture (vid_renderer,
                                 SDL_PIXELFORMAT_ARGB8888,
                                 SDL_TEXTUREACCESS_STREAMING,
                                 vid_width, vid_height);
if (!vid_texture) {
if (!vid_new_window (vptr0)) {
    sim_printf ("%s: Error configuring Video environment: %s\n", sim_dname(vid_dev), SDL_GetError());
    SDL_DestroyRenderer(vid_renderer);
    vid_renderer = NULL;
    SDL_DestroyWindow(vid_window);
    vid_window = NULL;
    SDL_Quit ();
    return 0;
    }

vid_format = SDL_AllocFormat (SDL_PIXELFORMAT_ARGB8888);

vid_beep_setup (400, 660);
SDL_StopTextInput ();

vid_controllers_setup (vptr0->vid_dev);
vid_windowID = SDL_GetWindowID (vid_window);

#endif

if (vid_flags & SIM_VID_INPUTCAPTURED) {
    char title[150];

    memset (title, 0, sizeof(title));
    strlcpy (title, vid_title, sizeof(title));
    strlcat (title, "                                             ReleaseKey=", sizeof(title));
    strlcat (title, vid_release_key, sizeof(title));
#if SDL_MAJOR_VERSION == 1
    SDL_WM_SetCaption (title, title);
#else
    SDL_SetWindowTitle (vid_window, title);
#endif
    }
else
#if SDL_MAJOR_VERSION == 1
    SDL_WM_SetCaption (vid_title, sim_name);
#else
    SDL_SetWindowTitle (vid_window, vid_title);
#endif

vid_ready = TRUE;
vptr0->vid_ready = TRUE;

sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE|SIM_VID_DBG_CURSOR, vid_dev, "vid_thread() - Started\n");
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 ((SDL_KeyboardEvent*)&event);
                vid_key (&event.key);
                break;

            case SDL_MOUSEBUTTONDOWN:
            case SDL_MOUSEBUTTONUP:
                vid_mouse_button ((SDL_MouseButtonEvent*)&event);
                vid_mouse_button (&event.button);
                break;

            case SDL_MOUSEMOTION:
                vid_mouse_move ((SDL_MouseMotionEvent*)&event);
                vid_mouse_move (&event.motion);
                break;
#if SDL_MAJOR_VERSION != 1

            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:
                if (event.window.windowID == vid_windowID) {
                    sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE|SIM_VID_DBG_CURSOR, vid_dev, "vid_thread() - Window Event: %d - %s\n", event.window.event, windoweventtypes[event.window.event]);
                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 (vid_flags & SIM_VID_INPUTCAPTURED)
                                 SDL_WarpMouseInWindow (NULL, vid_width/2, vid_height/2);   /* center position */
                             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 ();
                            vid_update (vptr);
                            break;
                        }
                    }
                break;
#endif

            case SDL_USEREVENT:
                /* There are 6 user events generated */
                /* 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 ();
                        vid_update (vptr);
                        event.user.code = 0;    /* Mark as done */
#if SDL_MAJOR_VERSION == 1
if (0)                        while (SDL_PeepEvents (&event, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_USEREVENT))) {
#else
if (0)                        while (SDL_PeepEvents (&event, 1, SDL_GETEVENT, SDL_USEREVENT, SDL_USEREVENT)) {
#endif
                            if (event.user.code == EVENT_REDRAW) {
                                /* Only do a single video update between waiting for events */
                                sim_debug (SIM_VID_DBG_VIDEO, vid_dev, "vid_thread() - Ignored extra REDRAW Event\n");
                                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 ((SDL_Cursor *)(event.user.data1), (t_bool)((size_t)event.user.data2));
                        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 ();
                        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 ((SDL_UserEvent*)&event);
                        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, vid_dev, "vid_thread() - QUIT Event - %s\n", vid_quit_callback ? "Signaled" : "Ignored");
                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, vid_dev, "vid_thread() - Ignored Event: Type: %s(%d)\n", eventtypes[event.type], event.type);
                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", sim_dname(vid_dev), SDL_GetError());
            sim_printf ("%s: vid_thread() - SDL_WaitEvent error: %s\n", vid_dname(vptr0->vid_dev), SDL_GetError());
        }
    }
vid_ready = FALSE;
if (vid_cursor) {
vid_controllers_cleanup ();
    SDL_FreeCursor (vid_cursor);
    vid_cursor = NULL;
vid_beep_cleanup ();
    }
#if SDL_MAJOR_VERSION != 1
SDL_DestroyTexture(vid_texture);
vid_texture = NULL;
SDL_DestroyRenderer(vid_renderer);
vid_renderer = NULL;
SDL_DestroyWindow(vid_window);
#endif /* SDL_MAJOR_VERSION != 1 */
vid_window = NULL;
sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE|SIM_VID_DBG_CURSOR, vid_dev, "vid_thread() - Exiting\n");
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;

#if SDL_MAJOR_VERSION == 1
_XInitThreads();
stat = SDL_Init (SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE);
#else
SDL_SetHint (SDL_HINT_RENDER_DRIVER, "software");

stat = SDL_Init (SDL_INIT_VIDEO);
#endif

if (stat) {
    sim_printf ("SDL Video subsystem can't initialize\n");
    return 0;
    }
vid_beep_setup (400, 660);
vid_video_events ();
vid_video_events (vptr);
vid_beep_cleanup ();
SDL_Quit ();
return 0;
}

const char *vid_version(void)
{
static char SDLVersion[80];
static char SDLVersion[160];
SDL_version compiled, running;

#if SDL_MAJOR_VERSION == 1
const SDL_version *ver = SDL_Linked_Version();
running.major = ver->major;
running.minor = ver->minor;
running.patch = ver->patch;
#else
SDL_GetVersion(&running);
#endif

SDL_VERSION(&compiled);

SDLVersion[sizeof (SDLVersion) - 1] = '\0';
if ((compiled.major == running.major) &&
    (compiled.minor == running.minor) &&
    (compiled.patch == running.patch))
    sprintf(SDLVersion, "SDL Version %d.%d.%d", 
    snprintf(SDLVersion, sizeof (SDLVersion) - 1, "SDL Version %d.%d.%d", 
                        compiled.major, compiled.minor, compiled.patch);
else
    sprintf(SDLVersion, "SDL Version (Compiled: %d.%d.%d, Runtime: %d.%d.%d)", 
    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 (vid_flags & SIM_VID_INPUTCAPTURED)
    fprintf (st, "ReleaseKey=%s", vid_release_key);
    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", vid_width, vid_height);
    fprintf (st, "  ");
    vid_show_release_key (st, uptr, val, desc);
        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");
#if SDL_MAJOR_VERSION != 1
    fprintf (st, "  SDL Video Driver: %s\n", SDL_GetCurrentVideoDriver());
#endif
    }
#if SDL_MAJOR_VERSION == 1
if (1) {
    char driver_name[64];
    const SDL_VideoInfo *info = SDL_GetVideoInfo();

    fprintf (st, "  Video Driver:                                     %s\n", SDL_VideoDriverName(driver_name, sizeof(driver_name)));
    fprintf (st, "  hardware surfaces available:                      %s\n", info->hw_available ? "Yes" : "No");
    fprintf (st, "  window manager available:                         %s\n", info->wm_available ? "Yes" : "No");
    fprintf (st, "  hardware to hardware blits accelerated:           %s\n", info->blit_hw ? "Yes" : "No");
    fprintf (st, "  hardware to hardware colorkey blits accelerated:  %s\n", info->blit_hw_CC ? "Yes" : "No");
    fprintf (st, "  hardware to hardware alpha blits accelerated:     %s\n", info->blit_hw_A ? "Yes" : "No");
    fprintf (st, "  software to hardware blits accelerated:           %s\n", info->blit_sw ? "Yes" : "No");
    fprintf (st, "  software to hardware colorkey blits accelerated:  %s\n", info->blit_sw_CC ? "Yes" : "No");
    fprintf (st, "  software to hardware alpha blits accelerated:     %s\n", info->blit_sw_A ? "Yes" : "No");
    fprintf (st, "  color fills accelerated:                          %s\n", info->blit_fill ? "Yes" : "No");
    fprintf (st, "  Video Memory:                                     %dKb\n", info->video_mem);
    }
#else
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


2006




2007
2008
2009
2010
2011
2012
2013
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 (vid_renderer, &info);
            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
2108
2109
2110
2111
2112
2113
2114
2115
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]));
        }
    }
#endif /* SDL_MAJOR_VERSION != 1 */
#if !defined (SDL_MAIN_AVAILABLE)
if (!vid_active)
    SDL_Quit();
#endif
return SCPE_OK;
}

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
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 (const char *filename)
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 (!filename)
if (!fullname)
    return SCPE_MEM;
#if SDL_MAJOR_VERSION == 1
#if defined(HAVE_LIBPNG)
if (!match_ext (filename, "bmp")) {
    sprintf (fullname, "%s%s", filename, match_ext (filename, "png") ? "" : ".png");
    stat = SDL_SavePNG(vid_image, fullname);
    }
else {
    sprintf (fullname, "%s", filename);
    stat = SDL_SaveBMP(vid_image, fullname);
    }
#else
sprintf (fullname, "%s%s", filename, match_ext (filename, "bmp") ? "" : ".bmp");
stat = SDL_SaveBMP(vid_image, fullname);
#endif /* defined(HAVE_LIBPNG) */
#else /* SDL_MAJOR_VERSION != 1 */
if (1) {
    SDL_Surface *sshot = sim_end ? SDL_CreateRGBSurface(0, vid_width, vid_height, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000) :
                                   SDL_CreateRGBSurface(0, vid_width, vid_height, 32, 0x0000ff00, 0x000ff000, 0xff000000, 0x000000ff) ;
    SDL_RenderReadPixels(vid_renderer, NULL, SDL_PIXELFORMAT_ARGB8888, sshot->pixels, sshot->pitch);
    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);
    }
#endif
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 (_screenshot_filename);
    _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
2254
2255
2256
2257
2258
2259
2260
2261
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)
{
int16 *data = (int16 *)stream;
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
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
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
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
2395

2396
2397
2398
2399
2400
2401
2402
2403


































































2404
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");
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) */
Changes to src/SIMH/sim_video.h.
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
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 t_bool vid_active;
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
Added src/advent/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added src/advent/a5toa1.ra.

































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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
Added src/advent/advent.dc.






















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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!
Added src/advent/advent.ft.










































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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
Added src/advent/advent.tx.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/advent/amain.ra.


















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/advent/bitset.ra.


























































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/advent/bug.ft.




























1
2
3
4
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
Added src/advent/carry.ra.



































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
Added src/advent/clear.bi.




















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
Added src/advent/compil.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
$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
Added src/advent/drop.ra.

























































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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
Added src/advent/dstroy.ra.






















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
Added src/advent/dumpdb.ft.

























































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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
Added src/advent/getin.ft.































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
Added src/advent/getwrd.ra.






























































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/advent/initad.ft.













































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/advent/io.ft.























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
Added src/advent/juggle.ra.

















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
Added src/advent/load.bi.












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
Added src/advent/move.ra.
























































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
Added src/advent/pct.ra.








































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
Added src/advent/pspeak.ra.













































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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
Added src/advent/put.ra.





















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
Added src/advent/rnd.ft.



















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
Added src/advent/rspeak.ra.

























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
Added src/advent/rstrgm.ft.






































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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
Added src/advent/runad.bi.





1
2
3
4
5
+
+
+
+
+
$JOB RUN ADVENTURE
.R FRTS
*ADVENT
*$
$END
Added src/advent/savegm.ft.







































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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

Added src/advent/seed.ra.


















































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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
Added src/advent/speak.ra.






















































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/advent/usr.ra.













































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/advent/vocab.ra.
























































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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
Added src/advent/yes.ft.






















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
Added src/basic-games/BINGO.BA.































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/BLKJAC.BA.














































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/BLKJAK.BA.







































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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
Added src/basic-games/BUNNY.BA.



















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
Added src/basic-games/CALNDR.BA.





























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
Added src/basic-games/CHECKR.BA.

































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/CRAPS.BA.














































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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
Added src/basic-games/DICE.BA.




























1
2
3
4
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
Added src/basic-games/FOOTBL.BA.






















































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/FOTBAL.BA.



























































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/GOLF.BA.






















































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/HELLO.BA.

















































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
Added src/basic-games/HOCKEY.BA.






































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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 
Added src/basic-games/KING.BA.









































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/LIFE.BA.


































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
Added src/basic-games/LIFE2.BA.



















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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
Added src/basic-games/MONPLY.B1.
















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
Added src/basic-games/MONPLY.BA.





















































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/POKER.BA.
























































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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

Added src/basic-games/ROCKET.BA.



































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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 
Added src/basic-games/ROCKT1.BA.







































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
Added src/basic-games/ROULET.BA.

































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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 
Added src/basic-games/SIGNS.BA.






































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/SNOOPY.BA.


































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
Added src/basic-games/SPACWR.BA.






























































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/TICTAC.BA.









































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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
Added src/basic-games/WAR.BA.







































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
Added src/basic-games/WAR2.BA.




























































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
Added src/basic-games/WEKDAY.BA.















































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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
Added src/basic-games/WUMPUS.BA.






















































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/YAHTZE.BA.


















































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/basic-games/YAHTZE.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
Changes to src/cc8/cross/code8.c.
768
769
770
771
772
773
774
775

776
777
778
779
780
781
782
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("\tACL");
	output_line("\tMQA");
	stkp = stkp + INTSIZE;
}

/*
 *	exclusive 'or' the primary and secondary registers
 *
 */
Changes to src/cc8/cross/extern.h.
1
2
3
4
5
6
7
8
9
10
11




1
2
3
4
5
6
7
-
-
-
-







/*
 * File extern.h: 1.0 (2018/12/29,22:45)
 */

/**
 * 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.
Changes to src/cc8/examples/basic.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




1
2
3
4
5
6
7
8






9
10
11
12
13
14
15


16
17



18
19

20
21
22


23
24
25

26
27

28
29
30





31
32
33
34
35
36
37
38
39

40
41
42
43

44
45
46
47
48
49
50
51
52

53
54
55
56

57
58
59
60
61
62
63
64
65

66
67
68
69

70
71
72
73
74
75
76
77
78

79
80
81
82

83
84
85
86
87
88
89
90
91

92
93
94
95

96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111


112
113
114
115
116
117
118
119
120
121

122
123
124

125
126
127
128
129
130
131
132
133


134
135
136
137
138
139
140

141
142

143
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
-
-
-
-








-
-
-
-
-
-
+
+
+
+
+


-
-
+
+
-
-
-
+
+
-



-
-
+
+

-
+

-
+


-
-
-
-
-
+
+
+
+
+




-
+


+
-
+








-
+


+
-
+








-
+


+
-
+








-
+


+
-
+








-
+


+
-
+















-
-
+
+








-
+


-
+








-
-
+
+





-
+

-
+

-
-
-
+
+
+
-
-




-
+




-
+


+



-
+


-
+

-
+

-
+
+











+
-
-
+
+











-
+





-
+
+

-
+

-
-
+
+



-
-
-
+
+
+


+



-
+












-
+


-
+


+
+


+

-
+

#include <libc.h>
#include <init.h>


#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 */
char Lb[CBMX];  /* Line buffer of CBMX chars */
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 */
char B [BMAX];  /* command input buffer */
char F [2];     /* temporary search string */
int B[BMAX];  /* command input buffer */
int F[2];     /* temporary search string */
char *m [LXMX]; /* pointers to lines of program. This is a real waste of space! */
char *p,*q,*x,*y,*z,*s,*d;

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);
	y=m[l];
	if(y){
	x=m[l];
	if(x){
		if(strstr(B," "))
			strcpy(y,B);
			strcpy(x,B);
		else
			y=m[l]=0;
			x=m[l]=0;
		return;
	}
	y=Lb;
	while(*y)
		y=y+DMAX;
	strcpy(y,B);
	m [l]=y;
	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;
	int o,tm;

	o=J( );
	tm=*p++;
	switch(*p++){
	switch(tm){
	case '=': return o==S( );
		break;
	case '#': return o!=S( );
	default: p--; return o;
	}
} /* end S */

int J(  ) {
	int o;
	int o,tm;

	o=K( );
	tm=*p++;
	switch(*p++){
	switch(tm){
	case '<': return o<J( );
		break;
	case '>': return o>J( );
	default: p--; return o;
	}
} /* end J */

int K(  ) {
	int o;
	int o,tm;

	o=V( );
	tm=*p++;
	switch(*p++){
	switch(tm){
	case '$': return o<=K( );
		break;
	case '!': return o>=K( );
	default: p--; return o;
	}
} /* end K */

int V(  ) {
	int o;
	int o,tm;

	o=W( );
	tm=*p++;
	switch(*p++){
	switch(tm){
	case '+': return o+V( );
		break;
	case '-': return o-V( );
	default: p--; return o;
	}
} /* end V */

int W(  ) {
	int o;
	int o,tm;

	o=Y( );
	tm=*p++;
	switch(*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(*p>='0'&&*p<='9'){
		while(*p>='0'&&*p<='9')
	if(isnum(*p)){
		while(isnum(*p))
			p++;
		atoi(q,&o);
		return o;
	}
	if(*p=='('){
		p++; o=S( ); p++;
		return o;
	}
	return P [*p++];
	return P[*p++];
} /* end Y */

int bufclear()
int bfclr()
{
	memset(m,0,LXMX);
	memset(Lb,0,CBMX);
}

int main(  ) {
	int tmp;  /* temp var to fix bug 07Sep2005 Somos */

	bufclear();
	while(puts("Ok\r\n"),gets(B))
	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;
				P[i]=0;
			while(l){
				while(!(s=m [l])) l++;
				while(!(s=m[l])) l++;
				while(*s!=' ') s++;                      /* skip line number */
				   if ( ! strstr ( s , "\"" ) ) {
				 while ( ( p = strstr ( s , "<>" ) ) ) * p ++ = '#' , * p = ' ' ;
				 while ( ( p = strstr ( s , "<=" ) ) ) * p ++ = '$' , * p = ' ' ;
                while ((p=strstr(s,"<>"))){*p++='#';*p=' ';}
                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;
					if((*s!=' ')|(j&1)) *d++=*s;
					s++;
				}
				*d=j=0;
				d--; /* backup to last char in line */
				if(B [1]!='='){
				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" */
						if(B[2]!='M') l=*--C;  /* "RETURN" */
						break;
					case 'I':
						if(B [1]=='N'){                         /* "INPUT" */
						if(B[1]=='N'){                         /* "INPUT" */
							tmp=*d;                         /* save for bug fix next line 07Sep2005 Somos */
							gets(p=B); P [tmp]=S( );
							gets(p=B); P[tmp]=S( );
						} else {                                /* "IF" */
							*(tmp=strstr(B,"TH"))=0;        /* "THEN" */
							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);
								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" */
						if(B[2]=='S'){ /* "GOSUB" */
							*C++=l; p++;
						}
						l=S( )-1;
						break;
					case 'F':                               /* "FOR" */
						*(tmp=strstr(B,"TO"))=0;        /* "TO" */
						tmp=strstr(B,"TO");        /* "TO" */
						*tmp=0;
						p=B+5;
						P [i=B [3]]=S( );
						P[i=B[3]]=S( );
						p=tmp+2;
						M [i]=S( );
						L [i]=l;
						M[i]=S( );
						L[i]=l;
						break;
					case 'N': /* "NEXT" */
						tmp=*d;
						if(P [tmp]<M [tmp]){
							l=L [tmp];
							P [tmp]++;
						if(P[tmp]<M[tmp]){
							l=L[tmp];
							P[tmp]=P[tmp]+1;
						}
						break;
					default:	break;
					}
				} else {
					p=B+2;
					P [*B]=S( );
					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 */
			bufclear();
			bfclr();
			break;
		case 'B': /* "BYE" command */
			return 0;
			exit(0);
			break;
		case 0:
            G( );
            break;
		default:
			G( );
            break;
		}/* end switch *B */
	return 0;
     }
} /* end main */
Changes to src/cc8/examples/fib.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


1
2
3
4
5

6
7

8
9

10
11
12
13
14
15











16
17
18
19
20
21
22
23
24
25
26
27
-
-
+
+
+


-


-
+

-
+





-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+

#include <init.h>
#include <libc.h>
/* 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)
int n;
{
    if (n < 2)
        return n;
	return n;
    else
        return fib(n - 1) + fib(n - 2);
	return fib(n-1)+fib(n-2);
}


int main()
{
    int i, rsl;
    i = 1;
    while (1) {
        rsl = fib(i);
        if (rsl < 0) {
            printf("Overflow:%d\r\n", i);
            break;
        }
        printf("Fib #%d = %d\r\n", i, rsl);
        i++;
    }
	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++;
	}
}
Added src/cc8/examples/forth.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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(">");
	}
}
Added src/cc8/examples/hlb.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#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();
            }
            
}
Deleted src/cc8/examples/init.h.
1

-
../include/init.h
Deleted src/cc8/examples/libc.h.
1

-
../include/libc.h
Added src/cc8/examples/pd.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/* 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");
}
Changes to src/cc8/examples/ps.c.


1
2





3
4
5
6
7
8
9

10
11
12
13

14
15
16
17
18

19
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 */
#include <init.h>
#include <libc.h>


#define COUNT 14

	int ar[20],i,j;

int main()
{
	int ar[20],i,j,n;

	n=14;
	for (i=1;i<n;i++) {
	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*(n-i-1);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");
}
Changes to src/cc8/include/libc.h.
37
38
39
40
41
42
43
44

45
46
47
48
49
50
51
52
53
54
55

56
57
58
59
60
61

62
63
64

65
66
67
68
69
70






71
72
73
37
38
39
40
41
42
43

44
45
46
47
48
49
50
51
52
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	sscanf vlibc6
#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	sprintf vlibc21
#define	toupper libc21
#define	memset libc22
#define	fgetc libc23
#define	fopen libc24
#define fputc libc25
#define fclose libc26
#define printf vlibc27
#define revcpy libc27
#define isalnum libc30
#define isspace libc31
#define fprintf vlibc32
#define fgets libc32
#define	fputs libc33
#define strcmp libc34
#define cupper libc35
#define fgets libc36
#define revcpy libc37
#define toupper libc40
#define fprintf vlibc36
#define printf vlibc37
#define sprintf vlibc40
#define sscanf vlibc41
#define scanf vlibc42
#define fscanf vlibc43

/* Declare function aliases. */ 
#define isdigit isnum
Changes to src/cc8/os8/c8.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
1
















2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

36
37
38
39
40
41
42
43
44
45
46
47
48

49
50
51
52
53
54
55
56
57
58
59
60

61
62
63

64
65
66
67
68
69


70
71
72
73
74
75
76

77
78




79
80
81
82
83
84
85
86







87
88
89
90
91
92
93
94
95
96
97
98





99
100
101
102
103
104
105

106
107













108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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/>.
 */
* 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:)
/* C pre-processor stub for PDP/8 c compiler 2017 */

* 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: */
/* 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[80],*p,*q,*tm,*dfp,tkbf[10],smbf[10];
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++;
    while (isspace(*p))
        p++;
}

strlen(p)
char *p;
{
	int n;
    int n;

	n=0;
	while (*p++)
		n++;
	return n;
    n=0;
    while (*p++)
        n++;
    return n;
}

getsym()
{
	q=tkbf;
	skpsp();
	while (isalnum(*p))
		*q++=*p++;
	*q=0;
	skpsp();
	return *tkbf;
    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;
    getsym();
    strcpy(dfp,tkbf);
    getsym();
    strcpy(dfp+512,tkbf);
    dfp+=10;
}

dorep()
int dorep()
{
	p=dflst;
	while (*p) {
		q=strstr(ln,p);
		if (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);
		}
		p+=10;
	}
    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];
    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;
	while (1) {
		fgets(p=ln);
		if (!*ln)
			break;
    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();

		while (*p) {
			if (*p==12)
				*p=' ';
			p++;
		}
        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,"$");
		
		p=strstr(ln,"#define ");
		if (p) {
			p=p+8;
			parse();
		} else
			fputs(ln);
	}
	fclose();
	fopen("HEADER.SB","r");
	fopen("CASM.TX","w");
	while (bfr=fgetc())
		fputc(bfr);
	fputc('!');
	p=asm;
		while (*p)
			fputc(*p++);
	fclose();
        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@@@"
    CALL 1,CHAIN
        ARG FNM
        HLT
        FNM,	TEXT "CC1@@@"
#endasm


}
Changes to src/cc8/os8/ccr.bi.
1

2
3
4
5
6
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
Added src/cc8/os8/ctbl.tx.

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  
Changes to src/cc8/os8/header.sb.
28
29
30
31
32
33
34

35
36
37
38
39
40
41
42
43


44
45
46
47
48
49
50
28
29
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
129

130
131
132
133
134
135
136




137









































































125
126
127
128
129
130
131

132
133
134
135
136
137
138
139
140
141
142
143

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
        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      
/
Deleted src/cc8/os8/init.h.
1

-
../include/init.h
Changes to src/cc8/os8/libc.c.
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
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
CLIST,  ITOA
		PUTS
		DISPXY
		GETC
		GETS
		ATOI
		SSCANF
		STRPD
		XINIT
		MEMCPY
		KBHIT
		PUTC
		STRCPY
		STRCAT
		STRSTR
		EXIT
		ISNUM
		ISALPHA
		SPRINTF
		TOUPPER
		MEMSET
		FGETC
		FOPEN
		FPUTC
		FCLOSE
		PRINTF
		REVCPY
		ISALNUM
		ISSPACE
		FPRINTF
		FGETS
		FPUTS
		STRCMP
		CUPPER
		FGETS
		REVCPY
		TOUPPER
		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
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
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
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
	DCA ZCTR
	TAD (7000		/ NOP
	DCA XINV
   	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
	CDF1			/ Change DF back to 1 in case SABR changes it!
#endasm
	while (*p==' ')
	 p++;
	if (*p=='-') {
	TADI JLC
	TAD (-55		/ -
#asm
	CLA
	TAD (7041       / CIA
	DCA XINV
	CDF1
	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
#endasm
	p++;
	}
	while (*p++) {
	JMP AT004
	TAD (10
#asm
	TAD (D-48		/ ASCII '0'
	DCA JLC
	TAD JLC
	SPA CLA
	JMP XRET
	TAD (D-10       / # OF DECIMAL DIGITS
	TAD JLC
	SMA CLA
	JMP XRET		/ EXIT IF NOT NUMBER
	TAD ZTMP
	CLL RTL			/ *4
	TAD ZTMP		/ *5
	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
	CLL RAL			/ *10
	TAD JLC
	TAD ZPTR
	DCA ZTMP
	ISZ JLC
	ISZ ZCTR		/ CHAR COUNTER
	ISZ ZCTR
#endasm
	}
#asm
XRET,	TAD ZCTR
	JMP AT004
AT006,	CLA
    TAD TMP
		MQL
		CMA
		TAD STKP	/ ->RSL
		DCA TMP
		TADI TMP
		DCA TMP
		TAD ZTMP
    DCA XINV
    CLA CLL CMA
	TAD STKP
	DCA TMP
	TADI TMP
	DCA TMP
	TAD ZTMP
XINV,	NOP
		DCAI TMP	/ WRITE RSL
	DCAI TMP
		ACL			/ RETURN LENGTH
#endasm
}


xinit()
{
	puts("PDP-8 C Compiler V1.0:\r\n");
}


memcpy(dst,src,cnt)
int dst,src,cnt;
{
#asm
	CLA
	TAD STKP
	TAD (-4
	DCA 14
    DCA FPTR
	CMA
	TADI 14
	DCA 13
    DCA ZPTR
	CMA
	TADI 14
	TAD ZCTR	
	DCA 12
	TADI 14
	CIA
	DCA ZTMP
CP1,	TADI 12
		DCAI 13
		ISZ ZTMP
		JMP CP1
#endasm

;
}

kbhit()
{

#asm
		CLA CMA
		KSF
		CLA
#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++);
		rsl|=(*sm++-*dm++);
	return rsl;
}

strcpy( dm , sm )
char *dm,*sm;
{
	while (*dm++=*sm++);
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
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
		IAC
		CMA
#endasm
}

isspace(vl)
int vl;
{
		vl;
#asm
		SNA
		JMP YNO
		TAD (D-33		/ ONE PAST ASCII ' '
		SMA CLA
YNO,	CLA SKP
		IAC
		CMA
#endasm
}


isalpha(vl)
int vl;
{
719
720
721
722
723
724
725
726

727
728
729
730
731
732
733
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
		IAC
		CMA
#endasm
}

cupper(p)				/* In place convert to uppercase */
int p;
{
	p;
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
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
		DCA ZTMP
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


796
797
798
















799

800
801
802
803
804
805
806
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
	int i;
	for (i=0;i<sz;i++)
		*dst++=dt;
	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











965
966
967
968
969
970




















971
972
973
974
975
976
977
978






979
980



981

982
983
984
985
986
987
988
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
}
	int n;

	n=0;
	while (*p++)
		n++;
	return n;

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, wast, ac, width, ch, cnv, base, ovfl, sign, *ibfr;
  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++;
	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
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--;
}
Deleted src/cc8/os8/libc.h.
1

-
../include/libc.h
Changes to src/cc8/os8/n8.c.
12
13
14
15
16
17
18

























19
20
21
22
23
24

25
26

27
28
29
30
31
32
33
34

35
36
37


38
39
40

41
42

43
44
45
46





47
48
49





















50







51
52
53
54
55
56



57
58
59
60
61
62
63
64
65
66










































67










68

69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85




86
87
88
89
90

91
92
93
94
95
96
97
98
99


100
101
102
103
104
105
106
107
108


109
110




111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132


133
134
135
136

137
138
139
140
141
142
143
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
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

49
50

51
52
53
54
55
56
57
58

59
60


61
62
63
64

65


66

67
68
69
70
71
72
73
74



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

109
110
111
112









113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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 280
#define CMAX 300
#define BMAX 64
#define LMAX 32
#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[LMAX];
int dumy[DMAX];
int *p,*q,*s,*ltpt;
int gsym,lsym,gadr,ladr,stkp,lctr,*fptr,gsz,ctr,tm,ectr,cop;
int glim,*n,ccm;
int gsym,lsym,gadr,ladr,stkp,lctr,*fptr,gsz,ctr,tm,ectr,glim;
int cop,*n,ccm;
int tmp;
int tkn[BMAX];
int bfr[BMAX];
int bfr[LXMX];
int tmbf[LMAX];
int smbf[LMAX];
int smbf[DMAX];
int Lb[BMAX];
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];
int izf,ixf,idf,ssz,icd;



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++;
}

getsym()

strpad(sym)
char *sym;
{
	q=tkbf;
	skpsp();
	while (isalnum(*p))
		*q++=*p++;
	*q=0;
	skpsp();
	return *tkbf;
}

    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--;
	}
	skpsp();
	sksps();
	return rtv;
} /* end S */

J(  ) {

	K( );
	switch(*p++){
	case '&': J( ); stri(20); break;
	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(-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( );
	skpsp();
	cop=*p;
	sksps();
	switch(cop=*p++) {
	switch(*p++) {
	case '*': W( ); stri(13); break;
	case '/': W( ); stri(14); break;
	case '%': W( ); stri(14);stri(-14); break;
	case '%': W( ); stri(14);stri(4082); break;
	case '=': if (*p=='=') {
				*p='$';return;
			  }
	default: p--; return;
	}
	stkp--;
} /* end W */


Y(  ) {
	int o,ctx;
	int o,ctx,ixf;
	int txbf[10];

	skpsp();
	sksps();

	if (!*p)
		return;

	if (cop) {
		stri(19);
		stkp++;
		cop=0;
	}

	if (*p=='"') {
		stri(10);
		stri(ltpt-ltbf);
		while (*++p-'"') {
		while (*++p-'"') 
			if (*p=='\\')
				switch (*++p) {
				case 'r':
					*p=13;
					break;
				case 'n':
					*p=10;
			}
			*ltpt++=*p;
		}
		*ltpt++=0;
		p++;
		return;
	}
	q=p;
	if(isdigit(*p)) {
		while(isdigit(*p))
			p++;
		stri(4);
		atoi(q,&tmp);
		p=p+atoi(p,&tmp);
		stri(tmp);
		return;
	}
	if (*p==39) {
		stri(4);
		stri(*++p);
		p+=2;
		return;
	}
	ixf=izf=idf=icd=0;
	ixf=izf=idf=0;
	if (!getsym()) {
		switch (*p++) {
			case '&':
				getsym();
				stri(21);
				stri(fndlcl(tkbf));
				return;
			case '*':
				getsym();
				ixf++;
				break;
            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(-26);
				return;
		        stri(29);
                return;
			case '(':
				S();
				return;
			case ')':
				icd=1;
				return;
            case '+':
                if (*p=='+') {
                    izf=-15;
                    p++;
                    getsym();
                    break;
                }
                Y();
                break;
			case '-':
				Y();
				stri(27);
				return;
            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++;
		while (*p && !o) {
			o=S( );
    if(*p=='('){
        strcpy(txbf,tkbf);
        ctx=o=0;p++;
        sksps();
        while (*p && !o && *p-')') {
            o=S( );
			if (icd)
				break;
			stkp++;
			stri(19);
			ctx++;		/* arg count */
		}
		stri(9);
		stri(ctx);
		stkp-=ctx;
		if ((o=strstr(gm,txbf))){
			stri(o-gm);
		}
		else {
			stri(gsz);
			strpad(txbf);
			strcat(gm,smbf);
			gsz+=9;
		}
		return;
	}
            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=-tmp;
			p+=2;
			izf=15;
			p=p+2;
			break;
		case '-':
			idf=-tmp;
			p+=2;
			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 (*p=='=')
				stri(19);
			else {
				stri(22);
				stkp--;
			}
        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 (*q=='=')
				break;
            if (izf<0)
                break;
			tmp=8;
			if (ixf)
			if (ixf && ssz==1)
				tmp=-8;
			ixf=0;
			stkp++;
			break;
	}
	stri(tmp);
	stri(o);
	if (izf)
		stri(15);
		stri(izf);
	if (idf)
		stri(25);
	if (ixf)
		stri(22);
	return;
} /* end Y */

procst(trm)
char trm;
{
	ccm=ctr=1;
	p=q=Lb;
	while(1) {
		tm=fgetc();
		ctr-=tm=='(';
		ctr+=tm==')';
		ccm-=tm==',';
		if (!ctr || tm==trm)
			break;
		*q++=tm;
	}
	*q=0;
	if (inproc)
		while (*p)
			S();
}

strpad(sym)
char *sym;
{
	char *a,*b;

	strcpy(a=smbf,"         ");  /* 9 spaces */
	while (*sym)
		*a++=*sym++;
}

addsym(sym,sz)
char *sym;
int sz;
{
	strpad(sym);
	smbf[8]=sz;
	if (inproc+(sz<0)) {
		smbf[7]=stkp+1;
		stkp+=sz;
		strcat(lm,smbf);
		stri(6);
		stri(sz);
		return;
	}
	smbf[7]=gadr;
	gadr+=sz;
	strcat(gm,smbf);
	gsz+=9;
}

fndlcl(sym)
char *sym;
{
	strpad(sym);
	smbf[7]=0;
	if (s=strstr(lm,smbf)) {
		ssz=s[8];
		s=s+7;
		return *s-stkp;
	}
	if (s=strstr(gm,smbf)) {
		ssz=s[8];
		s=s+7;
		return *s;
	}
	return 0;
}

gettk()
{
	char xtm;

	q=tkbf;
	while (isspace(xtm=fgetc()));
	while (isalnum(xtm)) {
		*q++=xtm;
		xtm=fgetc();
	}
	*q=0;
	return xtm;
}

popfr()
{
	while (*fptr==inproc) {
		cbrk=*--fptr;
		stri(23);
        fptr--;
        if (*dptr) {
		stri(*--fptr);
            stri(*dptr);
            *dptr=0;
        }
        else
		    stri(*fptr);
		stri(5);
		stri(*fptr+2);
		fptr--;
	}
}

dostt()
gtexp2()
{
	p=tmbf;
	while (tm!=';') {
		*p++=tm;
		tm=fgetc();
	}
	*p=0;
	strcpy(Lb,tkbf);
	strcat(Lb,tmbf);
	p=Lb;
	S();
	tm=1;
}

fnbrk()
{
	while (tm!='(')
		tm=fgetc();
    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;
}

next()
{
	char *lp;

cmst()
	int fflg;

	lp=0;
	if (*tkbf) {
		strcat(tkbf," ");
{
    do {
        ccm=0;
        S();
        ckop();
     } while (ccm);
}

		lp=strstr(tkn,tkbf);
	}
	fflg=lctr;
	if (lp) {
			switch(lp-tkn) {

dodecl()
{

    if (ctr)
        return;             /* No dec from func arg list */

			case 0:
				while (tm!=';' && tm!='{') {
					tm=gettk();
					strcpy(bfr,tkbf);
					while (isspace(tm))
    p=bfr; 
    while (*p) {
        vl=vf=1;
        getsym();
        strcpy(tmbf,tkbf);
        if (*p)
						tm=fgetc();
					switch (tm) {
			case '[':
				tm=gettk();
				atoi(tkbf,&fflg);
        switch (*p++) {
            case '=':
                Y();
                stri(19);
				addsym(bfr,fflg);
				tm=fgetc();
				break;
			case '(':
				stri(7);
				stri(gsz);
				if (strstr("main",tkbf))
					strcpy(tkbf,"XMAIN");
				addsym(tkbf,1);
				procst(')');
                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);
				stkp=-(ccm+1);
				while (*p) {
					getsym();
					addsym(tkbf,-1);
					if (*p)
    ppflg++;
    getln();
    while (1) {
        fflg=lctr;
        stri(99);
        mode=0;
        if (getsym()) {
            strpad(tkbf);
            smbf[6]=0;
            if (q=strstr(tkn,smbf))
						p++;
					stkp+=2;
				}
				stkp=0;
				tm=gettk();
				cbrk=200;
				break;
			case ',':
			case ';':
                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();
				addsym(tkbf,1);
				break;
                break;
					}				/* end whie */
				}					/* end case 0: */
				break;
			case 4:
				fflg=fflg+200;
			case 12:
            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:
				fnbrk();
				stri(5);
				*++fptr=fflg;
				stri(fflg);
                ppflg=0;
                p++;
				procst(0);
				cmst();
				stri(12);
				stri(tm=*fptr+2);
				*++fptr=cbrk;
				if (fflg<200)
				if (fflg<400)
					cbrk=tm;
				*++fptr=inproc;
				lctr+=3;
				lctr=lctr+3;
				tm=0;
				stri(99);
				break;
			case 7:
               break;
            case 5:
				tm=0;
				break;
			case 18:
				stri(23);
				stri(cbrk);
				break;
			case 24:
				if (tm-';') {
					procst(';');
					stri(-23);
					stri(ectr);
					tm=1;
				}
				break;
			case 31:
				fnbrk();
				cmst();
				procst(';');
				stri(5);
				stri(lctr++);
				*++fptr=lctr;
				procst(';');
				cmst();
				stri(12);
				stri(lctr+2);
				stri(23);
				stri(lctr+1);
				stri(5);
				stri(lctr++);
				procst(')');
				cmst();
				*++fptr=cbrk;
				*++fptr=inproc;
				stri(23);
				stri(lctr-2);
				stri(5);
				stri(lctr++);
				cbrk=lctr++;
				tm=0;
				break;
				tm=ppflg=0;
                break;
			default:
				dostt();
		} /* End switch */
	} else
		switch (tm) {
				case '{':
            case 6:
					inproc++;
					tm=1;
					break;
				case '`':
					tm=1;
					stri(29);
				case '}':
					break;
				case -1:
                stri(23);
                stri(cbrk);
                ppflg++;
                break;
            case 7:
				case 0:
					stri(0);
#asm
					CALL 1,CHAIN
					ARG FNM
					HLT
FNM,				TEXT "CC2@@@"
#endasm
				case '/':
					while (fgetc()!='/');			/* Skip comment */
					tm=1;
					break;
				default:
					dostt();
			    S();
	}
	return tm;
}

				stri(4073);     /* -23 */


main()
{
	char trm;

	memset(ltbf,0,&ssz-ltbf);
	fopen("CC.CC","r");
	strcpy(tkn,"int if else while break return for ");
	lctr = 10;
	ectr = 900;
				stri(ectr);
	ltpt = ltbf;
	fptr = fstk;
	*fptr = -1;
	gadr = 128; /* Start of globals */
	iinit(128);
	tm=gettk();
	while (1) {
		trm=next();
		tm=gettk();
		switch (trm) {
			case '{':
				inproc++;
				break;
			case '}':
                ppflg++;
                break;
            case 8:
				inproc--;
				if (!inproc) {
					stri(5);
                stri(5);
					stri(ectr++);
					stri(16);
                stri(*dptr=lctr+++200);
					stri(-stkp);
					stkp = *lm = 0;
					break;
				}
        }
			case ';':
			case 1:
				stri(99);
				if (!strcmp("else",tkbf)) {
					stri(-23);
					stri(200+lctr+2);
					popfr();
					*++fptr=200+lctr++;
					*++fptr=cbrk;
					*++fptr=inproc;
				}
    }
				else
					popfr();
			case 0:
				break;
			default:
				procst(';');
		}
}
	}
}

Changes to src/cc8/os8/p8.c.
12
13
14
15
16
17
18


























19
20
21
22
23
24

25
26

27
28
29
30
31
32
33
34

35
36

37
38
39






40
41
42
43


44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

60
61
62

63
64
65

66
67
68

69
70

71
72
73

74
75
76
77
78
79


80
81
82
83

84
85
86

87
88
89
90
91
92
93

94
95
96

97
98
99

100
101

102
103
104
105
106
107
108
109
110
111
112



113
114
115

116
117

118
119
120

121
122
123

124
125
126

127
128
129

130
131
132

133
134
135

136
137
138

139


140
141

142
143
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
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

50
51

52
53
54
55
56
57
58
59

60
61

62

63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85



86
87


88
89
90

91
92
93

94
95
96

97
98

99
100
101

102
103
104
105
106


107
108
109
110
111

112
113
114

115
116
117
118
119
120
121

122
123
124

125
126
127

128
129

130
131
132
133
134
135
136
137
138



139
140
141
142
143

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 280
#define CMAX 300
#define BMAX 64
#define LMAX 32
#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[LMAX];
int tkbf[DMAX];
int *p,*q,*s,*ltpt;
int gsym,lsym,gadr,ladr,stkp,lctr,*fptr,gsz,ctr,tm,ectr;
int gsym,lsym,gadr,ladr,stkp,lctr,*fptr,gsz,ctr,tm,ectr,glim;
int 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);
	}

	strcpy(xlt,"ITOA    PUTS    DISPXY  GETC    GETS    ATOI    SSCANF  XINIT   MEMCPY  KBHIT   PUTC    STRCPY  STRCAT  STRSTR  EXIT    ISNUM   ");
	strcat(xlt,"ISALPHA SPRINTF MEMSET  FGETC   FOPEN   FPUTC   FCLOSE  PRINTF  ISALNUM ISSPACE FPRINTF FPUTS   STRCMP  CUPPER  FGETS   REVCPY  ");
	strcat(xlt,"TOUPPER ");
	cupper(gm);
	while (strl()) {
		pflg=0;
		*tmstr=0;
		pflg=*tmstr=0;
		switch (strd()) {
			case 99:
				fputs("/\r\n");
				fputx("/\r");
				break; 
			case 1:
				fputs("\tJMSI PTSK\r\n");
				fputx("\tJMSI PTSK\r");
				break;
			case 3:
				strcpy(tmstr,"\tCIA\r\n");
				strcpy(tmstr,"\tCIA\r");
			case 2:
				fprintf("%s\tTADI STKP\r\n\tJMSI POP\r\n",tmstr);
				fprintf("%s\tTADI STKP\r\tJMSI POP\r",tmstr);
				break;
			case 4:
				fprintf("\tCLA\r\n\tTAD (%o\r\n",strd());
				fprintf("\tCLA\r\tTAD (%o\r",strd());
				break;
			case 5:
				tm=strd();
				if (tm<0)
					tm=200-tm;
				fprintf("CC%o,\r\n",tm);
					tm=400-tm;
				fprintf("CC%o,\r",tm);
				break;
			case 6:
				if (strl()>1)
					fprintf("\tTAD STKP\r\n\tTAD (%o\r\n\tDCA STKP\r\n",strl());
					fprintf("\tCLA\r\tTAD STKP\r\tTAD (%o\r\tDCA STKP\r",strl());
				else
					if (strl()>0)
						fputs("\tISZ STKP\r\n");
						fputx("\tISZ STKP\r");
				strd();
				break;
			case 7:
				p=gm+strd();
				while (*p-' ')
					fputc(*p++);
				fputs(",\r\n");
				fputx(",\r");
				break;
			case -8:
				strcpy(tmstr,"\tDCA JLC\r\n\tTADI JLC\r\n");
				strcpy(tmstr,"\tDCA JLC\r\tTADI JLC\r");
			case 8:
				if (strl()>0)
					fprintf("\tCLA\r\n\tTAD (%o\r\n%s\tJMSI PSH\r\n",strd(),tmstr);
					fprintf("\tCLA\r\tTAD (%o\r%s\tJMSI PSH\r",strd(),tmstr);
				else
					fprintf("\tCLA\r\n\tTAD STKP\r\n\tTAD (%o\r\n%s\tJMSI PSH\r\n",strd(),tmstr);
					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==6) + (t==17) + (t==23)) 
						fprintf("\tCLA\r\n\tTAD (%o\r\n\tJMSI PSH\r\n",tm++);
					fprintf("\tCLA\r\n\tTAD (%o\r\n\tMQL\r\n\tCALL 1,LIBC\r\n\tARG STKP\r\n\tCDF1\r\n",t);
					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\n\tJMSI PCAL\r\n\t%s\r\n",tkbf);
					fprintf("\tCPAGE 2\r\tJMSI PCAL\r\t%s\r",tkbf);
				if (tm)
				    fprintf("\tMQL\r\n\tTAD (%o\r\n\tTAD STKP\r\n\tDCA STKP\r\n\tSWP\r\n",-tm);
				    fprintf("\tMQL\r\tTAD (%o\r\tTAD STKP\r\tDCA STKP\r\tSWP\r",-tm);
				break;
			case 10:
				fprintf("\tCLA\r\n\tTAD GBL\r\n\tTAD (%o\r\n",strd());
				fprintf("\tCLA\r\tTAD GBL\r\tTAD (%o\r",strd());
				break;
			case -11:
				fputs("\tCIA\r\n\tTADI STKP\r\n\tJMSI POP\r\n\tSMA SZA CLA\r\n\tCMA\r\n");
				fputx("\tCIA\r\tTADI STKP\r\tJMSI POP\r\tSMA SZA CLA\r\tCMA\r");
				break;
			case 11:
				fputs("\tCIA\r\n\tTADI STKP\r\n\tJMSI POP\r\n\tSPA CLA\r\n\tCMA\r\n");
				fputx("\tCIA\r\tTADI STKP\r\tJMSI POP\r\tSPA CLA\r\tCMA\r");
				break;
			case 12:
					fprintf("\tSNA\r\n\tJMP CC%o\r\n",strd());
					fprintf("\tSNA\r\tJMP CC%o\r",strd());
				break;
			case 13:
				fputs("\tJMSI POP\r\n\tDCA JLC\r\n\tSWP\r\n\tCALL 1,MPY\r\n\tARG JLC\r\n\tCDF1\r\n");
				fputx("\tJMSI POP\r\tDCA JLC\r\tSWP\r\tCALL 1,MPY\r\tARG JLC\r\tCDF1\r");
				break;
			case -14:
				fputs("\tCALL 1,IREM\r\n\tARG 0\r\n\tCDF1\r\n");
				fputx("\tCALL 1,IREM\r\tARG 0\r\tCDF1\r");
				break;
			case 14:
				fputs("\tJMSI POP\r\n\tDCA JLC\r\n\tSWP\r\n\tCALL 1,DIV\r\n\tARG JLC\r\n\tCDF1\r\n");
				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:
				fputs("\tISZI JLC\r\n\tNOP\r\n");
				fputx("\tISZI JLC\r\tNOP\r");
				break;
			case 16:
				fprintf("\tMQL\r\n\tTAD STKP\r\n\tTAD (%o\r\n\tDCA STKP\r\n\tSWP\r\n\tJMPI POPR\r\n/\r\n",strd());
				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\n\tTAD (%o\r\n\tDCA JLC\r\n\tTADI JLC\r\n",strd());
					fprintf("\tCLA\r\tTAD (%o\r\tDCA JLC\r\tTADI JLC\r",strd());
				else
					fprintf("\tCLA\r\n\tTAD STKP\r\n\tTAD (%o\r\n\tDCA JLC\r\n\tTADI JLC\r\n",strd());
					fprintf("\tCLA\r\tTAD STKP\r\tTAD (%o\r\tDCA JLC\r\tTADI JLC\r",strd());
				if (pflg==0)
					break;
			case 19:
				fputs("\tJMSI PSH\r\n");
				fputx("\tJMSI PSH\r");
				break;
			case 20:
				fputs("\tANDI STKP\r\n\tJMSI POP\r\n");
				fputx("\tANDI STKP\r\tJMSI POP\r");
				break;
			case -20:
				fputs("\tJMSI POP\r\n\tMQA\r\n");
				fputx("\tJMSI POP\r\tMQA\r");
				break;
			case 21:
				if (strl()>0) 
					fprintf("\tCLA\r\n\tTAD (%o\r\n",strd());
					fprintf("\tCLA\r\tTAD (%o\r",strd());
				else
					fprintf("\tCLA\r\n\tTAD STKP\r\n\tTAD (%o\r\n",strd());
					fprintf("\tCLA\r\tTAD STKP\r\tTAD (%o\r",strd());
				break;
			case 22:
				fputs("\tDCA JLC\r\n\tTADI JLC\r\n");
				fputx("\tDCA JLC\r\tTADI JLC\r");
				break;
			case 23:
				if (strl()<200)
					fprintf("\tJMP CC%o\r\n",strl());
				if (strl()<400)
					fprintf("\tJMP CC%o\r",strl());
				strd();
				break;
			case -23:
					fprintf("\tJMP CC%o\r\n",strd());
					fprintf("\tJMP CC%o\r",strd());
				break;
			case 24:
				fputs("\tCIA\r\n\tTADI STKP\r\n\tJMSI POP\r\n\tSNA CLA\r\n\tCMA\r\n");
				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:
				fputs("\tMQL\r\n\tCMA\r\n\tTADI JLC\r\n\tDCAI JLC\r\n\tSWP\r\n");
				fputx("\tMQL\r\tCMA\r\tTADI JLC\r\tDCAI JLC\r\tSWP\r");
				break;
			case 26:
				fputs("\tSNA CLA\r\n");
				fputx("\tSNA CLA\r");
			case -26:
				fputs("\tCMA\r\n");
				fputx("\tCMA\r");
				break;
			case 27:
				fputs("\tCIA\r\n");
				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;
	fprintf("\tLAP\r\n\tCPAGE %o\r\nLCC0,\t%o\r\nXCC0,\tCC0\r\nCC0,\t\r\n",ltsz+2,-ltsz);
	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)
			fputs("; ");
			fputx("; ");
		if ((ltsz&7)==0) 
			fputc(13);
		ltsz--;
	}
	fprintf("\r\n\tEAP\r\nGBLS,\t%o\r\n",gadr);
	fputs("\r\nMCC0,\t0\r\n\tCDF1\r\n\tTAD LCC0\r\n\tSNA CLA\r\n\tJMP I MCC0\r\n\tTAD XCC0\r\n\tDCA JLC\r\nDCC0,\tCDF0\r\n\tTADI JLC\r\n");
	fputs("\tJMSI PSH\r\n\tCLA\r\n\tISZ JLC\r\n\tISZ LCC0\r\n\tJMP DCC0\r\n\tJMP I MCC0\r\nCCEND,\t0\r\n\t\END\r\n");
	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();

}
Added src/chekmo/CHEKMO.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/chekmo/CHEKMO.TX.

cannot compute difference between binary files

Added src/chekmo/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added src/chekmo/decus-8-822.pdf.

cannot compute difference between binary files

Added src/dcp/DCP.WU.





















































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/dcp/DCP16.BN.

cannot compute difference between binary files

Added src/dcp/DCP24.BN.

cannot compute difference between binary files

Added src/dcp/README.md.





















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/
Added src/e8/AUTHORS.md.
















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/
Added src/e8/README.TX.


















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
Added src/e8/e8base.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/e8/e8cmds.tx.





















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
Added src/e8/e8file.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/e8/e8srch.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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,

$

Added src/e8/e8srch.tx.



















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.
Added src/focal69/DEC-08-AJAD-D.pdf.

cannot compute difference between binary files

Added src/focal69/FLOAT.ZZM.






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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!
Added src/focal69/FOCAL.ZZM.















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/focal69/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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/
Added src/focal69/overlays/4KVT.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
70
71
72
73
74
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.

$

Added src/focal69/overlays/4WORD.BN.

cannot compute difference between binary files

Added src/focal69/overlays/8KVT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	
$

Added src/focal69/overlays/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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

Added src/focal69/overlays/VTRUB.PA.

1
+
	VTRUB=	0001 	     /ENABLE VIDEO TERMINAL RUBOUT
Added src/kermit-12/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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/
Added src/kermit-12/k12clr.pal.






















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!
Added src/kermit-12/k12crf.boo.















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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
Added src/kermit-12/k12crf.enc.




















































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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)
Added src/kermit-12/k12deb.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
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!
Added src/kermit-12/k12dec.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
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!
Added src/kermit-12/k12enb.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
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!
Added src/kermit-12/k12enc.doc.

















































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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]
Added src/kermit-12/k12enc.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
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!
Added src/kermit-12/k12fl0.ipl.







































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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
Added src/kermit-12/k12fl1.ipl.







































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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
Added src/kermit-12/k12glb.boo.


























1
2
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~~~~
~?
Added src/kermit-12/k12glb.enc.







































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)
Added src/kermit-12/k12ip0.odt.



































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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.
Added src/kermit-12/k12ip1.odt.



































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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.
Added src/kermit-12/k12ipg.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!
Added src/kermit-12/k12ipl.doc.


































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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]
Added src/kermit-12/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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/	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!
Added src/kermit-12/k12mit.ann.


























































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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* *.]

------------------------------
Added src/kermit-12/k12mit.boo.























































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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
Added src/kermit-12/k12mit.bwr.
































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/kermit-12/k12mit.doc.



























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
Added src/kermit-12/k12mit.dsk.




































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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]
Added src/kermit-12/k12mit.enc.





































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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)
Added src/kermit-12/k12mit.lst.











































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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



Added src/kermit-12/k12mit.not.
































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
Added src/kermit-12/k12mit.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
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!
Added src/kermit-12/k12mit.upd.























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

------------------------------
Added src/kermit-12/k12pch.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
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!
Added src/kermit-12/k12pl8.boo.






















































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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
Added src/kermit-12/k12pl8.enc.







































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
Added src/kermit-12/k12prm.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/	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
Added src/misc/prism.js.















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,"&amp;").replace(/</g,"&lt;").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,"&quot;")+'"'}).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(/&amp;/,"&"))}),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:/![sra](?=[:}]$)/,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:/[{}()\[\]]/};
Added src/music/1TNSLD.MU.
















































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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+)
$

Added src/music/BABYEL.MU.





























































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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!)
$
Added src/music/ENTER.MU.
































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$
Added src/music/FIFTH1.MU.







































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$
Added src/music/FIFTH3.MU.






















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$

Added src/music/FUGUE.MU.





















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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+)
$

Added src/music/GMINOR.MU.












































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$
Added src/music/INV201.MU.
















































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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+)
$

Added src/music/INV204.MU.
















































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
$

Added src/music/INV208.MU.






























































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
$

Added src/music/INV210.MU.









































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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-)
$

Added src/music/INV212.MU.




















































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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-
$

Added src/music/INV213.MU.




























































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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+++
$

Added src/music/INV214.MU.























































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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+)
$

Added src/music/INV315.MU.

















































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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+)
$

Added src/music/JCOOK1.MU.

























































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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--

$
Added src/music/JCOOK2.MU.





































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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+)

$
Added src/music/LUVWIL.MU.









































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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+)

$

Added src/music/MAPLE.MU.







































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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#+)
$

Added src/music/MINUET.MU.








































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$

Added src/music/MINUTE.MU.











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
$

Added src/music/MUSIC.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
>
$
Added src/music/MUSIC1.MU.























































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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--)
$
Added src/music/MUSIC2.MU.






















































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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+)

$
Added src/music/MUSIC3.MU.















































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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-)

$
Added src/music/MUSIC4.MU.









































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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-)

$
Added src/music/MUSIC5.MU.










































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

$
Added src/music/MUSIC6.MU.


































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/music/PLAYOV.PA.




















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
$
Added src/music/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#  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
Added src/music/USA.MU.














































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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-)

$
Added src/music/YANKEE.MU.
























































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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+)
$

Added src/music/decus-8-804.pdf.

cannot compute difference between binary files

Added src/os8/ock/CUSPS/BITMAP.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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=.
	$-$-$

Added src/os8/ock/CUSPS/BOOT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/CUSPS/CAMP.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$
Added src/os8/ock/CUSPS/CREF.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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!!
$$$$$$$$$$$$$$$$$$

Added src/os8/ock/CUSPS/DIRECT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$
Added src/os8/ock/CUSPS/DTCOPY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$
Added src/os8/ock/CUSPS/DTFRMT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

$

Added src/os8/ock/CUSPS/EDIT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

$
/***********************************************************************

Added src/os8/ock/CUSPS/EPIC.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	>
	 
	 
	$

Added src/os8/ock/CUSPS/FOTP.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$
Added src/os8/ock/CUSPS/FUTIL.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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


$$$$

Added src/os8/ock/CUSPS/HELP.HL.




































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
&COPY
&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

Added src/os8/ock/CUSPS/HELP.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
$
Added src/os8/ock/CUSPS/MCPIP.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$
Added src/os8/ock/CUSPS/MSBAT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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"
$
Added src/os8/ock/CUSPS/PAL8.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

	$$$$$
Added src/os8/ock/CUSPS/PIP.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/CUSPS/PIP10.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$-$-$

Added src/os8/ock/CUSPS/RESORC.BI.












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

Added src/os8/ock/CUSPS/RESORC.MA.





























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/CUSPS/RESOV0.MA.





































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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
Added src/os8/ock/CUSPS/RESOV1.MA.













































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/CUSPS/RESOV2.MA.












































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/os8/ock/CUSPS/RESOVD.MA.











































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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


Added src/os8/ock/CUSPS/RKLFMT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/os8/ock/CUSPS/RLFRMT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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.

$
Added src/os8/ock/CUSPS/RXCOPY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$
Added src/os8/ock/CUSPS/SET.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$
Added src/os8/ock/CUSPS/SRCCOM.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/CUSPS/TDCOPY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

$

Added src/os8/ock/CUSPS/TDFRMT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

$ 
Added src/os8/ock/CUSPS/TDINIT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$
Added src/os8/ock/CUSPS/TECO.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/HANDLERS/ASR33.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/BAT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

Added src/os8/ock/HANDLERS/CR8E.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/CS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/DF32NS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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
	$

Added src/os8/ock/HANDLERS/DF32SY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/DUMP.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/HANDLERS/KL8E.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	>
	$

Added src/os8/ock/HANDLERS/L645.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/LINCNS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$$$$$$$$

Added src/os8/ock/HANDLERS/LINCSY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/LPSV.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/LQP.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/os8/ock/HANDLERS/LSPT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$$$$$$$

Added src/os8/ock/HANDLERS/PT8E.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$$$$$$$$

Added src/os8/ock/HANDLERS/RF08NS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/RF08SY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/RK08NS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/RK08SY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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>
	$
Added src/os8/ock/HANDLERS/RK8ENS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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


	$$$$

Added src/os8/ock/HANDLERS/RK8ESY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$
Added src/os8/ock/HANDLERS/RL0.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$
Added src/os8/ock/HANDLERS/RL1.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$
Added src/os8/ock/HANDLERS/RL2.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$
Added src/os8/ock/HANDLERS/RL3.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$
Added src/os8/ock/HANDLERS/RLC.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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.

$
Added src/os8/ock/HANDLERS/RLSY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$
Added src/os8/ock/HANDLERS/ROMMSY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/RX78C.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
/
Added src/os8/ock/HANDLERS/RXNS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
/
Added src/os8/ock/HANDLERS/RXSY1.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/HANDLERS/RXSY2.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/HANDLERS/TC08NS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/TC08SY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/TD8EA.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$$$$$$$

Added src/os8/ock/HANDLERS/TD8EB.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$$$$$$$

Added src/os8/ock/HANDLERS/TD8EC.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$$$$$$$

Added src/os8/ock/HANDLERS/TD8ED.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$$$$$$$

Added src/os8/ock/HANDLERS/TD8ESY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/TM8E.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/HANDLERS/VR12.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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	/_

	$

Added src/os8/ock/HANDLERS/VT50.PA.

cannot compute difference between binary files

Added src/os8/ock/HANDLERS/VXNS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
        >
$ $ $ $ $ $ $ $ 

Added src/os8/ock/HANDLERS/VXSY.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
        >
$ $ $ $ $ $ $ $ 

Added src/os8/ock/LANGUAGE/BASIC/BASIC.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

	$$
Added src/os8/ock/LANGUAGE/BASIC/BCOMP.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/LANGUAGE/BASIC/BLOAD.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$$$$$

Added src/os8/ock/LANGUAGE/BASIC/BRTS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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>

Added src/os8/ock/LANGUAGE/BASIC/EAEDEF.PA.

1
+
EAE=1
Added src/os8/ock/LANGUAGE/BASIC/LCBAS.BI.















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
Added src/os8/ock/LANGUAGE/BASIC/RESEQ.BA.












































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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
Added src/os8/ock/LANGUAGE/BASIC/UCBAS.BI.















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

Added src/os8/ock/LANGUAGE/BASIC/UF.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$

Added src/os8/ock/LANGUAGE/FORTRAN2/FORT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
$


Added src/os8/ock/LANGUAGE/FORTRAN2/FPATCH.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
/
	$

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/ATAN.SB.























































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/FLOAT.SB.










































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/GENIOX.SB.

































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/INTEGR.SB.



























































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/IOH.SB.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/IOPEN.SB.
























































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/IPOWRS.SB.



































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/POWERS.SB.































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/RWTAPE.SB.












































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/SQRT.SB.





















































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/TRIG.SB.























































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/UTILTY.SB.




















































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN2/LIBSET.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/LANGUAGE/FORTRAN2/LOADER.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/LANGUAGE/FORTRAN2/SABR.CO.






































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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.)

Added src/os8/ock/LANGUAGE/FORTRAN2/SABR.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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


$

Added src/os8/ock/LANGUAGE/FORTRAN2/SPATCH.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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 /
	$

 
Added src/os8/ock/LANGUAGE/FORTRAN4/F4.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/LANGUAGE/FORTRAN4/FORGEN.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
$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
Added src/os8/ock/LANGUAGE/FORTRAN4/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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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
Added src/os8/ock/LANGUAGE/FORTRAN4/FORLIB.EN.

























































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRA.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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-@@@@"
	$

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/ABS.RA.





















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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/ACOS.RA.














































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/ADC.RA.



























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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>

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/ALOG.RA.





















































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/ALOG10.RA.
















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/AMAX.RA.

























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/AMIN.RA.

























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/AMOD.RA.

































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/ASIN.RA.









































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/ATAN.RA.









































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/ATAN2.RA.
















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CABS.RA.

























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CARITH.RA.














































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CEXP.RA.







































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CHARS.RA.
















































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CHKEOF.RA.



































1
2
3
4
5
6
7
8
9
10
11
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	.
Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CLK8A.RA.


































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CLOCK.RA.















































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CLOG.RA.

















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CMPLX.RA.



















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/COS.RA.
















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/COSD.RA.



















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/COSH.RA.



















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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.

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CSIN.RA.


































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/CSQRT.RA.




























































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DABS.RA.





















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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DATAN.RA.











































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DATAN2.RA.



























































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DATE.RA.



























































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DBLE.RA.



























1
2
3
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DCOS.RA.

























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DEXP.RA.










































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DEXP3.RA.






































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DIM.RA.
































1
2
3
4
5
6
7
8
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DLOG.RA.










































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DLOG10.RA.
























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DMAX1.RA.










































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DMIN1.RA.










































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DMOD.RA.















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DSIGN.RA.







































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DSIN.RA.






















































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/DSQRT.RA.















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXP.RA.













































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXP3.RA.

































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXPCC.RA.





































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXPCI.RA.
























































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXPDD.RA.






















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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXPDI.RA.































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXPDR.RA.

























1
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXPIC.RA.














































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXPID.RA.






















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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXPID2.RA.







































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXPII.RA.




















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/EXPIR.RA.



















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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/FLOAT.RA.


















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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/IDINT.RA.







































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/IFIX.RA.






























1
2
3
4
5
6
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/LTR.RA.


















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/ONQIB.RA.






































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/PAUSE.RA.











































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/PLOT.RA.












































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/REAL.RA.









































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/REALTM.RA.




























































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/RFCV.RA.

















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/RFDV.RA.






























1
2
3
4
5
6
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
Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/RSW.RA.













































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/SIGN.RA.








































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/SIN.RA.




























































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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.

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/SIND.RA.
















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/SINH.RA.









































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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.

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/SNGL.RA.





















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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/SQRT.RA.
































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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.

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/TAN.RA.
























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/TAND.RA.
















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/TANH.RA.




















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

Added src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/XFIX.RA.
















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

Added src/os8/ock/LANGUAGE/FORTRAN4/LOAD.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

	$$$$$

Added src/os8/ock/LANGUAGE/FORTRAN4/PASS2.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/LANGUAGE/FORTRAN4/PASS2O.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/   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

Added src/os8/ock/LANGUAGE/FORTRAN4/PASS3.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/LANGUAGE/FORTRAN4/RALF.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/LANGUAGE/FORTRAN4/RTL.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
//

	$$$-$$$-$$$

Added src/os8/ock/LANGUAGE/FORTRAN4/RTS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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].
Added src/os8/ock/SYSTEM/BATCH.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$$$$$$$$$$

Added src/os8/ock/SYSTEM/BUILD.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/SYSTEM/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
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

Added src/os8/ock/SYSTEM/CCL.MA.

















































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/SYSTEM/CCLAT.MA.




















































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/os8/ock/SYSTEM/CCLCD.MA.

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/SYSTEM/CCLCDX.MA.






































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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
Added src/os8/ock/SYSTEM/CCLCOR.MA.
























































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/SYSTEM/CCLDAT.MA.



























































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/SYSTEM/CCLDRV.MA.











































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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+.



Added src/os8/ock/SYSTEM/CCLMSG.MA.










































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/SYSTEM/CCLPS.MA.































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
Added src/os8/ock/SYSTEM/CCLREM.MA.














































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/SYSTEM/CCLRUN.MA.






















































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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

Added src/os8/ock/SYSTEM/CCLSB2.MA.



























































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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
Added src/os8/ock/SYSTEM/CCLSEM.MA.







































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/os8/ock/SYSTEM/CCLSIZ.MA.














































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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

Added src/os8/ock/SYSTEM/CCLSUB.MA.






































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/os8/ock/SYSTEM/CCLTAB.MA.






























































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/SYSTEM/CCLTBL.MA.



























































































































































































































































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/ock/SYSTEM/CD.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/SYSTEM/LCSYS.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
$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

Added src/os8/ock/SYSTEM/OS8.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$

Added src/os8/ock/SYSTEM/UCSYS.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
$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

Added src/os8/tools/ocomp/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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/
Added src/os8/tools/ocomp/ocomp.hl.






























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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.
Added src/os8/tools/ocomp/ocomp.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

$$$$$

Added src/os8/v3d/BASIC/LCBAS.BI.















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
Added src/os8/v3d/BASIC/UCBAS.BI.















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

Added src/os8/v3d/LANGUAGE/FORTRAN4/DLOG.RA.










































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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

Added src/os8/v3d/LANGUAGE/FORTRAN4/FORLIB.RL.

cannot compute difference between binary files

Added src/os8/v3d/SYSTEM/LCSYS.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
$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

Added src/os8/v3d/SYSTEM/UCSYS.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
$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

Changes to src/os8/v3f/UCSYS.BI.
8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
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
1103
1104
11.347/ IF C-1352
4423
11.350/ IF C-3034
1164
11.351/ IF C-5270
3017
11.352/ IF C-0340
Changes to src/pidp8i/gpio-common.c.in.
33
34
35
36
37
38
39




40
41
42
43
44
45
46
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
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
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 ///////////////////////////////////
// Find Pi's GPIO base address
//
// This is and its helper function get_dt_ranges are based on code
// published by the Raspberry Pi Foundation:
//
// https://github.com/raspberrypi/userland/blob/master/host_applications/linux/libs/bcm_host/bcm_host.c

// Provide fallback for non-Pi case to avoid a link error.
static unsigned get_dt_ranges(const char *filename, unsigned offset)
{

    unsigned address = ~0;
    FILE *fp = fopen(filename, "rb");
    if (fp) {
        unsigned char buf[4];
        fseek(fp, offset, SEEK_SET);
        if (fread(buf, 1, sizeof buf, fp) == sizeof buf) {
            address = buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3] << 0;
        }
        fclose(fp);
    }
    return address;
}

static unsigned bcm_host_get_peripheral_address(void)
#if !defined(HAVE_BCM_HOST_H)
    static unsigned bcm_host_get_peripheral_address(void) { return 0; }
{
   unsigned address = get_dt_ranges("/proc/device-tree/soc/ranges", 4);
   if (address == 0)
#endif
      address = get_dt_ranges("/proc/device-tree/soc/ranges", 8);
   return address == ~0 ? 0x20000000 : address;
}


//// 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
Changes to src/pidp8i/main.c.in.
135
136
137
138
139
140
141
142

143
144
145
146
147
148
149
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);
            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
Added src/uwfocal/12DEMO.FC.

cannot compute difference between binary files

Added src/uwfocal/12KFNS.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/uwfocal/16KCPR.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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!

Added src/uwfocal/16KLIB.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
	$
Added src/uwfocal/16KXII.BN.

cannot compute difference between binary files

Added src/uwfocal/16KXII.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/uwfocal/16MPLT.BN.

cannot compute difference between binary files

Added src/uwfocal/16MPLT.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/uwfocal/2NDEMO.FC.

cannot compute difference between binary files

Added src/uwfocal/32KXII.BN.

cannot compute difference between binary files

Added src/uwfocal/32KXII.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/uwfocal/8XFIO.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/uwfocal/8XFPP.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
Added src/uwfocal/AXIS.FC.

cannot compute difference between binary files

Added src/uwfocal/AXISET.FC.

cannot compute difference between binary files

Added src/uwfocal/BSLASH.BN.

cannot compute difference between binary files

Added src/uwfocal/BSLASH.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/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 '"'
	$
Added src/uwfocal/CARD1.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
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

Added src/uwfocal/CARD2.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
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)

Added src/uwfocal/CARD3.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
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)

Added src/uwfocal/CARD4.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
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

Added src/uwfocal/CONVRT.FC.

cannot compute difference between binary files

Added src/uwfocal/CRSHAR.FC.

cannot compute difference between binary files

Added src/uwfocal/DATE.FC.

cannot compute difference between binary files

Added src/uwfocal/EIGVAL.FC.

cannot compute difference between binary files

Added src/uwfocal/EIGVEC.FC.

cannot compute difference between binary files

Added src/uwfocal/ERRORS.FD.




























































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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

Added src/uwfocal/EVDEMO.FC.

cannot compute difference between binary files

Added src/uwfocal/F32K4E.SV.

cannot compute difference between binary files

Added src/uwfocal/FCOM45.BN.

cannot compute difference between binary files

Added src/uwfocal/FCOM45.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/ 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
	$
Added src/uwfocal/FCOM47.BN.

cannot compute difference between binary files

Added src/uwfocal/FCOM47.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/ 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
	$
Added src/uwfocal/FILNAM.FC.

cannot compute difference between binary files

Added src/uwfocal/HEADER.FC.

cannot compute difference between binary files

Added src/uwfocal/HEADER.HL.





























1
2
3
4
5
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.




Added src/uwfocal/LOWPAS.FC.

cannot compute difference between binary files

Added src/uwfocal/LPT8I.BN.

cannot compute difference between binary files

Added src/uwfocal/LPT8I.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/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
	$ = $ = $
Added src/uwfocal/LSTSQR.FC.

cannot compute difference between binary files

Added src/uwfocal/NOTE1.TX.




















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

Added src/uwfocal/NOTE2.TX.































1
2
3
4
5
6
7
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

Added src/uwfocal/PLCARD.FC.

cannot compute difference between binary files

Added src/uwfocal/PLDEMO.FC.

cannot compute difference between binary files

Added src/uwfocal/PLOTER.FC.

cannot compute difference between binary files

Added src/uwfocal/README.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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added src/uwfocal/SCROLL.SV.

cannot compute difference between binary files

Added src/uwfocal/SKETCH.FC.

cannot compute difference between binary files

Added src/uwfocal/SMSORT.FC.

cannot compute difference between binary files

Added src/uwfocal/UWFOCL.FC.

cannot compute difference between binary files

Added src/uwfocal/VUDEMO.FC.

cannot compute difference between binary files

Added src/uwfocal/XYAXIS.FC.

cannot compute difference between binary files

Added 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 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
Added src/vtedit/TECO.IN.










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
Added src/vtedit/VTEDIT.DC.































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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.
Added src/vtedit/VTEDIT.TE.





































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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
!
Changes to tools/autosetup-update.
1
2

3
4
5


6
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 status --meta    autosetup | grep ^EXEC | cut -c8-) auto.def
fossil rm --hard $(fossil status --missing autosetup | grep ^MISS | cut -c8-)
chmod -x         $(fossil changes --meta    autosetup) auto.def
fossil rm --hard $(fossil changes --missing autosetup)
fossil add autosetup/*
Changes to tools/bosi.
1
2
3
4

5
6
7
8
9
10
11
1
2
3

4
5
6
7
8
9
10
11



-
+







#!/bin/bash
# bosi - The Binary OS Image creation/update script
#
# Copyright © 2016-2017 by Warren Young
# 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
36

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

58
59
60
61
62
63
64
29
30
31
32
33
34
35

36
37
38
39
40
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, shrink, image, and finish.
    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=stretch-lite
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
91
92

93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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 python-pip || true
    apt-get -y install fossil python3-pip python3-pexpect python3-yaml || true
    pip install pexpect

    test -f /usr/include/curses.h || apt-get -y install libncurses-dev

    if [ -z "$(type -p fossil)" ]
    then
        fb=/usr/local/bin/fossil
        src=https://tangentsoft.com/pidp8i/uv/fossil-2.8-raspbian-9.6-stretch
        wget -O $fb $src
        chmod +x $fb
        apt-get -y install libssl-dev    # user might rebuild Fossil later
    fi

    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
133

134
135
136
137
138
139
140
141
142
143
144
145
146















147
148
149
150
151
152
153
115
116
117
118
119
120
121

122
123
124
125
126
127
128
129
130
131
132
133
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 https://tangentsoft.com/$repo museum/$repo.fossil
        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
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
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 systemctl enable ssh || true           # disabled by default
    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

    encpass=$(openssl passwd -1 edsonDeCastro1968)
    sudo usermod -p $encpass pidp8i
    sudo passwd -e pidp8i

    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

    do_wait "Powering off"
    sudo poweroff
    # 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
# Shrink the filesystem on the OS SD card we're about to image to just a
# bit bigger than required to hold its present contents.
#

# The extra 100 megs in the arithmetic below accounts for the /boot
# partition, since the `resizepart` command takes a partition end value,
# not a size value.
#
# We don't calculate the actual end of the /boot partition and use that
# value because we want a bit of slack space to buy time for an end user
# who neglects to expand the card image into the free space available on
# their SD card after first boot.
function do_shrink() {
    test "$USER" = "root" || exec sudo $this shrink

    # Must be last, else later "sudo" will fail on the expired password
    set -x

    echo 'pidp8i:edsonDeCastro1968' | sudo chpasswd &&
    umount /dev/sda2 || true    # might auto-mount, might not
    e2fsck -f /dev/sda2         # resize2fs demands it

        sudo passwd -e pidp8i
    # Pack it down tight
    blocks=$(
        resize2fs -M /dev/sda2 2>&1 |
        grep 'blocks long' | 
        grep -wo '[0-9]\+'
    )
    if [ "$blocks" -gt 0 ]
    then
        # And now give it a bit of breathing room
        parted /dev/sda resizepart 2 $(($blocks * 4096 + 10**8))b
        resize2fs /dev/sda2
        poweroff
    else
        echo "Failed to extract new filesystem size from resize2fs!"
        echo
        exit 1
    fi
}


# This script images the OS SD card in a USB reader on a Mac OS X box.
# 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
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
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
        *) 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

    diskutil unmountDisk $dev           # it auto-mounted
    sudo time dd if=$rdev bs=1m of=$img
    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
    sudo time dd if=/dev/zero of=$rdev bs=1m || true
    sudo time dd if=$img of=$rdev bs=1m
    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 ;;
    sh*) do_shrink ;;
    im*) do_image ;;
    fi*) do_finish ;;
    *)   usage ;;
esac
Changes to tools/diff-os8.
13
14
15
16
17
18
19
20
21

22
23
24
25
26
27
28
29
30
31
32


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

mkdir rka_last rkb_last rka_fail rkb_fail

../../tools/os8xplode --rk fail.rk05 --rk last.rk05
echo "unpack 1 of 4: last rka"
../../bin/os8-cp -rk0s last.rk05 -i RKA0:*.* rka_last/
echo "unpack 2 of 4: last rkb:"
../../bin/os8-cp -rk0s last.rk05 -i RKB0:*.* rkb_last/
echo "unpack 3 of 4: fail rka"
../../bin/os8-cp -rk0s fail.rk05 -i RKA0:*.* rka_fail/
echo "unpack 4 of 4: fail rkb"
../../bin/os8-cp -rk0s fail.rk05 -i RKB0:*.* rkb_fail/

diff rka_last rka_fail
diff rkb_last rkb_fail
diff -q last.0 fail.0
diff -q last.1 fail.1
Added tools/e8-update.














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
Added tools/mkmanpdf.


























1
2
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
Changes to tools/mmake.
1
2
3


4
5

6
7
8
9
10
11
12
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
# mmake - Runs make -jN where N is 1.5x the number of CPU cores.  Use
#         with GNU or BSD make.
#
# Copyright © 2017-2019 Warren Young
# 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
32
33


34
35
36

37
38
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=make
MAKE=$(which gmake make 2> /dev/null | head -1)
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
if [ -z "$BDIR" ] ; then BDIR="$(dirname "$(which "$0")")" ; fi

$MAKE -j$(($("$BDIR"/corecount) * 15 / 10)) "$@"
Added tools/os8-cmp.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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()
Added tools/os8-progtest.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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()
  
Added tools/os8xplode.
















































































































































































































































































































































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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;
}
Changes to tools/restyle.
1
2
3
4

5
6
7
8
9
10
11
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 HACKERS.md file.
#           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,
Added tools/simh-bisect.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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
Changes to tools/simh-update.in.
204
205
206
207
208
209
210






211
212
213
214
215
216
217
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
Changes to tools/test-os8-run.
169
170
171
172
173
174
175
176





177
178

179
180
181
182
183



184
185

186
187
188
189
190
191
192
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
            /([\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$7}x;
        }{$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
            /([\w.-]*?)                      # attached file's basename
            ((-temp-)([\w./-]+)              # optional temp component 
	     (\.[\w./-]+))?
            ([\s,])                          # pattern end anchor
        }{$1.../$3/$4$5}x;
        }{$1.../$3/$4$6$8$9}x;

        # Add cleaned line to ofile
        print $of $_;
    }

    close $if;
    close $of;
Deleted tools/test-os8-send-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































































































































-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#!/usr/bin/env python
# -*- coding: utf-8 -*-
########################################################################
# test-os8-send-file - Repeatedly sends random files through class simh
#   method os8_send_file() and pulls it back through os8_get_file(),
#   then checks that the file is unchanged.
#
# Copyright © 2017 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')

# Our local modules
from pidp8i import *
from simh   import *

# Other core modules we need
import filecmp
import os.path
import random
import tempfile


#### gen_file ##########################################################
# Generate a random text file.  In order that the process be lossless
# through the txt2ptp/ptp2txt filters and the SIMH + OS/8 terminal
# handling, we use only printable ASCII plus CR+LF characters.  Returns
# the name of the generated file.

def gen_file ():
    f = tempfile.NamedTemporaryFile (delete = False, suffix = '.tmp')
    for i in range (0, random.randint (10, 4000)):
      if random.randint (0, 10) != 0:
        # Normal case: write some number of printable ASCII characters
        # on this line.
        for j in range (0, random.randint (1, 79)):
          f.write (chr (random.randint (32, 126)))
      # else: Every now and then, just write a blank line

      f.write ('\r\n')

    f.close ()
    return f.name


#### main ##############################################################

def main ():
  # 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 (), 'w', 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 + "..."
  s.send_cmd ("att rk0 " + rk)
  s.send_cmd ("boot rk0")

  # Setup
  random.seed ()

  # Transfer several random files through.  Beware increasing the range
  # too far: max is 99999 due to the file name length limit of OS/8 due
  # to the temporary file naming scheme we use in the loop.
  for i in range (0, 1000):
    # Build another temp file
    ifn = gen_file ()
    of = tempfile.NamedTemporaryFile (suffix = '.out', delete = False)
    of.close ()

    # Send it
    ofn = of.name
    tfn = 'T%05d.TX' % i
    s.os8_send_file (ifn, tfn)
    s.os8_get_file (tfn, ofn)

    # Did it change?
    if filecmp.cmp (ifn, ofn):
      print ifn + ' transferred successfully.'
      s.os8_send_cmd ('\\.', 'DEL ' + tfn)
      os.remove (ifn)
      os.remove (ofn)
    elif os.path.getsize (ofn) == 0:
      print "\nDifferences found: output is empty!\n"
    else:
      print "\nDifferences found:\n--------------------------------"
      os.system ('diff -wu "' + ifn + '" "' + ofn + '"')
      print 'Left ' + tfn + ' inside OS/8.'


if __name__ == "__main__":
    main()