-
Notifications
You must be signed in to change notification settings - Fork 0
/
k11rco.mac
906 lines (743 loc) · 24.1 KB
/
k11rco.mac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
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
.sbttl K11RCO New RT11 connect code
.psect
.ident /3.51.4/
.if ndf, K11INC
.ift
.include /IN:K11MAC.MAC/
.endc
.enabl gbl
; Copyright (C) 1986 Change Software, Inc
;
; 07-MAY-1986 10:55 Brian Nelson
;
; Edits:
;
; 16-May-86 11:12:55
;
;3.51.2 Add tasks to watch for carrier transitions and hung XOFF'ed
; status (XC/XL/CL only).
;3.51.3 Check for tt output ring buffer overflow.
;3.51.4 Kludge to correct for bug in RT11 5.1 XL handler
;3.56.5 Allow XL a little time to finish 09-Dec-86 10:52:04
;3.56.6 Fix LF processing. Not strictly needed because the XL driver
; under 5.2 and later filters LF's that follow CR's. We will do
; it here anyway though for non-DEC drivers (like CL and KL).
;
;
;
; Complete rewrite of RT11 connect code. For XC/XL/CL, we use
; a multitasking approach and drive it via interupts (actually
; timer and read completions). For MultiTerminal data, see code
; at DOMT:. Maybe the MT code will run on SJ now, the XL/CL/XC
; code will NOT.
.psect concod ,ro,i,lcl,rel,con
.psect condat ,rw,d,lcl,rel,con
JSW = 44
ERRBYTE = 52
$XLV51 = 16. ; XL/XC for RT11 v5.1
$XLV52 = 17. ; XL/XC for RT11 v5.2
.mcall .WRITC ,.SPFUN ,.TTINR ,.TTYIN ,.TTYOU ,.TTOUTR
.mcall .MRKT ,.CMKT ,.TWAIT ,.SCCA ,.QSET ,.PRINT
.mcall .RSUM ,.SPND ,.RCTRLO,.GVAL ,.SERR ,.HERR
.iif ndf, SJ$TEST ,SJ$TEST = 0
GLOBAL <SJ$TEST>
.if ne ,SJ$TEST
.ift
.macro .RSUM
.endm .RSUM
.macro .SPND
.endm .SPND
.macro .MRKT a,b,c,d,e,f
.endm .MRKT
.macro .TWAIT a,b,c,d,e,f
.endm .TWAIT
.macro .CMKT a,b,c
.endm .CMKT
.endc ; IF ne, SJ$TEST
.psect condat
.even
.macro BEEP
mov #7 ,r0
.TTOUTR
.endm BEEP
.macro SCHEDULE taskheader
mov r0 ,-(sp)
mov taskheader,r0
mov #runable,STATE(r0)
mov (sp)+ ,r0
.endm SCHEDULE
RUNABLE = 1
STATE = 0
TASKADDR= 2
IODONE = 4
IOPEND = 6
IOBUFF = 10
IOSTALL = 12
; This is the schedulers 'JOB' table.
tlist:
; STATE DISPATCH IODONE IOPEND IOBUFF IOSTALL
xkhead: .word 0 ,XKPROC ,0 ,0 ,0 ,0
tthead: .word 0 ,TTPROC ,0 ,0 ,0 ,0
rmhead: .word 0 ,RMPROC ,0 ,0 ,TTBUFF ,0
sthead: .word 0 ,STPROC ,0 ,0 ,0 ,0
wthead: .word 0 ,WTPROC ,0 ,0 ,0 ,0
.word -1 ,-1 ,-1 ,-1 ,0 ,0
sjlist: .word STSDONE ,WTDONE ,TTDONE ,0
hdsize = tthead - xkhead
.if NE ,SJ$TEST
.ift
sj.dec: .word 1 ; Testing under XM
.iff
sj.dec: .word 0 ; SJ and no .MRKT if NE
.endc
crflag: .blkw 1 ; CR seen flag
xk: .blkw 1 ; Save flag
rt.v51: .blkw 1 ; Need to know Xl handler version
xksdon: .blkw 1 ; Remote terminal set done
ttsdon: .blkw 1 ; Local terminal set done
ioseen: .blkw 1 ; Some input was seen somewhere
ttio: .blkw 1 ; Console read worked
xkio: .blkw 1 ; Remote read worked
eseen: .blkw 1 ; Control \ happened at console
ttunit: .blkw 1 ; Our console terminal unit
xkunit: .blkw 1 ; Connected line's unit number
scca: .word 0,0,0 ; For getting control C's
mark: .blkw 4 ; For MARKTIME
short: .word 0,1 ;
mtime: .word 0,0 ; Timeout value
twait: .word 0,0,0,0 ; 'AREA' for TWAITS
cancel: .word 0,0,0,0 ; 'AREA' for CANCEL mark time
rmwork: .word 0,0,0,0
rmtime: .word 0,3*60.
ttmark: .word 0,0,0,0
ttwait: .word 0,3
suspend:.word 0
xkrd1: .word 0,0,0,0,0,0
xkrd2: .word 0,0,0,0,0,0
xkr1do: .word 0
xkr2do: .word 0
xkwork: .word 0,0,0,0,0,0
done: .word 0
xkmark: .word 0,0,0,0
xktime: .word 0,10.
idle: .word 0
idmark: .word 0,0,0,0
idtime: .word 0,62. ; Check for idle state
stswork:.word 0,0,0,0,0,0 ; For status watcher task's .SPFUN
stsmark:.word 0,0,0,0 ; For .MRKT to schedule status watcher
ststime:.word 0,20. ; Schedule status watcher 20 ticks
wtmark: .word 0,0,0,0 ; For XOFF watcher
wttime: .word 0,20. ; Do it every 20 ticks
xksts: .word 0,0 ; Save status
wtsts: .word 0,0 ; Save status again
wtcount:.word 0 ; Save low 16 bits of char count
charcou:.word 0,0 ; Total chars sent by HOST
tsxbrk: .byte 0,133 ; TSX+ SET break address
.word 0 ; No 'break' char
.word brkast ; Where to jump to
tsxnbrk:.byte 0,133 ; TSX+, turn break AST's off
.word 0,0 ; Disable
XKSIZE = 200 ; Large buffers for remote reads
xkbuff: .blkb XKSIZE+2 ; Buffer for connected line
xkpoint:.word xkbuff
ttbuff: .blkb 80. ; Buffer for console terminal
rmbuff: .blkb 2
msg: .blkb 110
co: .asciz /Connecting to /
spd: .asciz / Speed: /<200>
.even
.psect concod
.enabl lsb
doconn::call check ; SJ checks
.iif NE, SJ$TEST, clr clkflg ; For testing
clr xk ; Clear device type
tstb ttname ; Anything there ?
bne 1$ ; Yes
message <Please use the SET LINE command>,cr
return ; Exit
1$: strcpy #msg ,#co ; Build a header up.
strcat #msg ,#ttname ; ...
strcat #msg ,#spd ; ......
cmpb ttname ,#'0 ; Is this using XC/XL/CLn?
blo 5$ ; No
cmpb ttname ,#'9 ; Well?
bhi 5$ ; No
call domt ; Switch modes then.
return ; Exit
5$: inc xk ; Flag device class
call init ; Startup
bcs 100$ ; Oops
call ttinit ; Save terminal characteristics
bcs 90$ ; Die
;
10$: tst done ; Time to go now ?
bne 90$ ; Yes, exit
mov #ttbuff ,r4 ; Pointer to local term buffer
inc suspend ; Count the number of suspends
.SPND ; Suspend ourself
clr idle ; No longer idle
tst sj.dec ; Minimal SJ system?
beq 25$ ; No
mov #sjlist ,r5 ; Yes, No mark time so we will
20$: tst @r5 ; have to call all of the watchers
beq 25$ ; If zero, all done
jsr pc ,@(r5)+ ; Do it for Sj krud
br 20$ ; Check for more calls needed for SJ
25$: mov #tlist ,r5 ; Find out who woke up
30$: cmp taskaddr(r5),#-1 ; End of the table now?
beq 50$ ; Yes, suspend again
tst state(r5) ; Runnable task ?
beq 40$ ; No
jsr pc ,@taskaddr(r5) ; Yes, run the sucker.
40$: add #HDSIZE ,r5 ; Next task control block please
br 30$ ; ...
50$: br 10$ ; Go away until something happens
90$: .CMKT #cancel,#0 ; Kill all marktime requests
call ttrst ; Restore terminal chars
100$: bic #40000+10000+100,@#JSW ; Clear special modes
.SCCA #scca,#0 ; Enable control C stuff again
.CMKT #cancel,#0 ; Kill all marktime requests
return
.dsabl lsb
.sbttl misc support routines
.enabl lsb
.mcall .scca
$TCFIG = 424
ttinit: clc ; Basically a NO-OP
return ; Exit
init: tst tsxsave ; True TSX+ today?
beq 5$ ; No
.SERR ; To be safe
mov #tsxbrk ,r0 ; Set break AST
EMT 375 ; Do it.
.HERR ; Normal now
5$: mov #tlist ,r0 ; Clear out task list
10$: cmp TASKAD(r0),#-1 ; All done with list
beq 20$ ; Yes
clr STATE(r0) ; No
clr IODONE(r0) ; ...
clr IOPEND(r0) ; ...
clr IOSTALL(r0) ; Stalled flag.
add #HDSIZE ,r0 ; Next please
br 10$ ; ...
20$: clr eseen ; No escape seen
clr crflag ; No carriage returns yet
clr idle ;
clr done ; ...
clr xkr1done ; Clear out
clr xkr2done ; Ditto
clr xkio ; No remote I/O seen
clr ttio ; No local I/O seen
clr ioseen ; No I/O at all happened
clr ttsdon ; No terminal settings done yet
clr xksdon ; No terminal settings done yet
clr charcount ; Clear out data count
clr charcount+2 ; All 32 bits of it please.
mov #1 ,suspend ; Suspension count
mov #xkbuff ,xkpoint ; Current pointer into buffer.
.SCCA #scca ,#scca+4 ; Trap all control c's
calls ttyset ,<#ttname,#LUN.XK>
calls ttyini ,<#ttname,#LUN.XK,#0>
tst r0 ; Successfull setup of port?
beq 25$ ; Yes, continue
jmp 90$ ; No, exit
;
25$: .print #msg ; A header
message <Unknown>,cr ; ...
message <Type your local escape sequence to return to RT11>,cr
;
; All done, prime the system.
.MRKT #idmark,#idtime,#iddone,#11
.MRKT #stsmark,#ststime,#stsdone,#7
.MRKT #wtmark,#wttime,#wtdone,#10
.SPFUN #stswork,#XC.CONTROL,#STSDRV,#xksts,#0,#1
clr rt.v51 ; Flag if 5.1 or 5.2 please
cmpb xksts+1 ,#$XLV51 ; Is this a 5.1 system?
bne 30$ ; No, must be 5.2 or later.
inc rt.v51 ; Yes, a serious bug in XL/XC
30$: ;
.SPFUN #xkrd1,#LUN.XK,#203,#xkbuff,#xksize,#1,#xkdone
.MRKT #ttmark,#ttwait,#ttdone,#3
clc ; Successfull exit
br 100$ ; Exit
;
90$: mov r0 ,r1 ; Save error code
message <Error from line initialization - >
direrr r1
sec ; Failure to initialize things
100$: return ; Exit INIT code
.dsabl lsb
.sbttl Restore line settings, check options for SJ exec
ttrst: .TWAIT #twait,#short ; Eat up extra .RSUM's ?
.TWAIT #twait,#short ; ...Ditto (one Tick)
.TWAIT #twait,#short ; ...Ditto
.TWAIT #twait,#short ; ...Ditto
calls ttyfin ,<#ttname,#LUN.XK>; Drop things and exit
calls ttyrst ,<#ttname,#LUN.XK>;
.SERR ; To be safe
tst tsxsave ; TSX+
beq 100$ ; No
mov #tsxnbrk,r0 ; Yes, turn break AST's off
EMT 375 ; Do it
100$: .HERR ; Restore
return ; Bye
.enabl lsb
$CONFIG = 300
$SYSGEN = 372
SJMON = 1 ; RMON offset 300 (Config)
CLOCK = 100000 ; RMON offset 300 (Config)
MRKTIM = 2000 ; RMON offset 372 (Sysgen)
.mcall .GVAL
check: .GVAL #xkwork,#$CONFIG ; Get the configuration word
bit #SJMON ,r0 ; Is this a SJ monitor ?
bne 100$ ; No, just exit
bit #CLOCK ,r0 ; SJ, is there a clock present
bne 10$ ; Yes
message <%Kermit-W Kermit needs a line or programable CLOCK>,CR
10$: .GVAL #xkwork ,#$SYSGEN ; Check for MARK TIME support
bit #MRKTIM ,r0 ; Well?
bne 100$ ; Yes, support is present
message <%Kermit-W The SJ executive should have timer support>,CR
message <sysgen'ed for the optimal operation of Kermit.>,CR
inc sj.dec ; Save the result
sec ; Flag
return ; Exit
100$: clc ; Success
return ; Exit
.sbttl reading from XK (XC/XL/CL) and TT:
.enabl lsb
ttdone: mov r0 ,-(sp) ; Save this
clr tthead+state ; Assume no data present
bis #40000+10000+100+20,@#JSW; Enable special modes
.TTINR ; Check for input waiting for term
bcs 90$ ; Nothing to do
bicb #^C177 ,r0 ; Strip any parity bits please
tst rt.v51 ; Is this RT11 5.1 and OLD XL/XC
bne 10$ ; Yes, kludge a bug in the handler
asr crflag ; See if a carriage return preceeds
bcc 5$ ; a line feed. Was last one a CR?
cmpb r0 ,#12 ; Ignore LINE feeds Please
beq 90$ ; Exit on <LF>
5$: cmpb r0 ,#15 ; Is this one a carriage return?
bne 10$ ; No
inc crflag ; Yes, save for next time.
10$: movb r0 ,ttbuff ; Insure we save this
SCHEDULE #TTHEAD ; Get a process going to use data
tst suspend ; Fix up the .SPND count
beq 20$ ; ...
dec suspend ; ...
.RSUM ; Get scheduler going
20$: br 100$ ; Exit
;
90$: .MRKT #ttmark,#ttwait,#ttdone,#3
;
100$: mov (sp)+ ,r0 ; Restore this
return ; Exit
.dsabl lsb
ttproc: clr STATE(r5) ; Don't come back right away
save <r0,r1,r4> ; Save registers we use
mov #ttbuff ,r4 ; Point to terminal buffer
movb @r4 ,r0 ; Get the data please
cmpb r0 ,conesc ; Escape sequence today?
bne 50$ ; No, must dump character as is
mov #10*60. ,r1 ; Loop a while looking for data
10$: bis #40000+10000+100+20,@#JSW ; Enable special modes
.TTINR ; Was the escape characters, trynext
bcc 30$ ; Got something valid
.TWAIT #twait,#short ; Nothing, wait a little bit
tst sj.dec ; Did we have timer support?
beq 20$ ; Yes
CPUWAIT #1 ; No (really should boot FB up)
20$: sob r1 ,10$ ; Next please
br 100$ ; Exit as we did not get any data
30$: bicb #^C177 ,r0 ; Strip junk from the character
movb r0 ,@r4 ; Insure we save this
cmpb r0 ,conesc ; Double escape sequence read?
beq 50$ ; Yes, dump that character as is
call concmd ; No, check for emulator command
br 100$ ;
50$: tst duplex ; Need local echoing today?
beq 60$ ; No
.TTOUTR ; Yes, echo the data please
60$: setpar (r4) ,(r4) ; Set parity up if needed
SCHEDULE #RMHEAD ; Dump the data down the line
100$: .MRKT #ttmark,#ttwait,#ttdone,#3
unsave <r4,r1,r0> ; Pop and exit
return ; Exit
xkdone: SCHEDULE #XKHEAD ; Get things going when we exit
clr xkhead+iopend ; I/O is complete
mov sp ,xkhead+iodone ; Say so.
mov #xkbuff ,xkpoint ; Reset buffer pointer now.
tst suspend ; Fix up suspention count
beq 100$ ; No
dec suspend ; Yes, suspend--
.RSUM ; Resume mainline
100$: return ; Thus XKPROC will get called
xkredo: SCHEDULE #XKHEAD ; If we need to retry terminal output
tst suspend ; Fix up suspention count
beq 100$ ; No
dec suspend ; Yes, suspend--
.RSUM ; Resume mainline
100$: return ; Thus XKPROC will get called
xkproc: mov r0 ,-(sp) ; Save please
mov r1 ,-(sp) ; Ditto
mov r3 ,-(sp) ; ....
mov xkpoint ,r1 ; Dump the buffer now
mov sp ,ioseen ; Say we got some data
210$: tstb (r1) ; All done yet?
beq 240$ ; Yes
movb (r1)+ ,r0 ;
cmpb parity ,#PAR$NO ; No parity?
bne 215$ ; No, clear high bit
tst con8bit ; SET CON 7/8 ?
bne 215$ ; No
bicb #200 ,r0 ; Strip high bit now
215$: .TTOUTR ; No, dump the data
bcs 220$ ; If we fail, come back later
add #1 ,charcount ; Bump up the character count
adc charcount+2 ; The high part also.
inc xkpoint ; Remember where we were at now.
br 210$ ; Next please
;
220$: .MRKT #xkmark,#xktime,#xkredo,#13 ; Output ring buffer is FULL.
inc IOSTALL(r5) ; Flag we are stalled.
clr STATE(r5) ; No longer runable please
br 250$ ; Exit
;
240$: mov #xkbuff ,xkpoint ; Reset the pointer now.
mov #xkbuff ,r3 ; Disk logging next
call dumplog ;
clr STATE(r5) ;
clr IODONE(r5) ;
clr IOSTALL(r5) ;
mov sp ,IOPEND(r5) ; ...
.TWAIT #twait ,#short ; /56/
.SPFUN #xkrd1,#LUN.XK,#203,#xkbuff,#xksize,#1,#xkdone
250$: mov (sp)+ ,r3 ; Pop r3
mov (sp)+ ,r1 ; Pop r1
mov (sp)+ ,r0 ; And R0 please
return ; Exit
rmproc: mov r0 ,-(sp) ; Save
mov r1 ,-(sp) ; ...
tst IOPENDING(r5) ; Are we still waiting for XC/XL?
beq 30$ ; /56/ No
.CMKT #cancel ,#3 ; /56/ Disable terminal input checking
mov #10. ,r1 ; /56/ Wait a total of 10 ticks
10$: tst IOPENDING(r5) ; /56/ Done YET?
beq 20$ ; /56/ Yes, at last
.TWAIT #twait ,#short ; /56/ Wait a tick
sob r1 ,10$ ; /56/ And go back and take a peek
20$: .MRKT #ttmark,#ttwait,#ttdone,#3 ; /56/ Reenable terminal checking
30$: mov IOBUFF(r5),r1 ; /56/ Pointer to I/O buffer
movb @r1 ,rmbuff ; Copy the data
clrb rmbuff+1 ; Tack a NULL on the end.
mov sp ,IOPENDING(r5) ; Flag that we are waiting here.
.MRKT #rmwork,#rmtime,#300$,#5; Start timer to clear driver.
.WRITC #xkwork,#LUN.XK,#rmbuff,#1,#200$,#1
100$: mov (sp)+ ,r1 ; Pop
mov (sp)+ ,r0 ; ...
clr STATE(r5) ; Don't reschedule please.
return ; Simple
;
; XC/XL WRITE completion.
200$: clr RMHEAD+IOPENDING ; I/O no longer pending
.CMKT #rmwork,#5 ; Stop the marktime for XOFFED
return ; Ast completion is a NO-OP
;
; MARKTIME completion.
300$: call x.ttxon ; Force a driver reset.
clr RMHEAD+IOPENDING ; Say we are ready for MORE data
return ; Done.
.sbttl Status watchers
stsdone:mov r0 ,-(sp) ; Save this (?)
SCHEDULE #STHEAD ; Schedule the status checker
br wtexit ; Exit now
wtdone: mov r0 ,-(sp) ; Save this (?)
SCHEDULE #WTHEAD ; Schedule the xon/xoff checker
wtexit: tst suspend ; Fix the suspended count
beq 100$ ; No
dec suspend ; Yes, suspend--
.RSUM ; Start scheduler now
100$: mov (sp)+ ,r0 ; Pop R0 and exit
return ; Exit the ast now
.enabl lsb
stproc: save <r0,r1,r2> ; Save registers we may need
clr STATE(r5) ; No longer runnable
mov xksts ,r2 ; Save old status word
.SPFUN #stswork,#XC.CONTROL,#STSDRV,#xksts,#0,#1
bcs 100$ ; Failed??
mov xksts ,r1 ; Get the current status
bic #^C4 ,r2 ; Leave only the carrier detect
bic #^C4 ,r1 ; bits on for the status
cmp r1 ,r2 ; Are they the same?
beq 100$ ; Yes, then ignore
BEEP ; Make a small noise
tst r1 ; Not the same, did we loose it?
bne 10$ ; No, we must have just gotten it
message <%Kermit-11 Carrier lost>,cr
br 100$ ; Exit
10$: message <%Kermit-11 Carrier detected>,cr
100$: .MRKT #stsmark,#ststime,#stsdone,#7 ; Reschedule us
unsave <r2,r1,r0> ; Pop registers and exit
return ; Exit
.dsabl lsb
.sbttl Check for hung driver
.enabl lsb
wtproc: save <r0,r1,r2> ; Save registers please
clr STATE(r5) ; No longer runnable
mov wtsts ,r2 ; Save old Status flags
.SPFUN #stswork,#XC.CONTROL,#STSDRV,#wtsts,#0,#1
bcs 100$ ; It should ALWAYS work.
mov wtsts ,r1 ; Get new status
bic #^C3 ,r2 ; Leave only XOFF'ed status
bic #^C3 ,r1 ; Same for the current status word
tst r1 ; See if XOFF'ed at either end
beq 100$ ; No, so just reschedule ourself
cmp r2 ,r1 ; Same status as last time here?
bne 100$ ; No, just exit normally then.
mov #tlist ,r0 ; Ok, check for any i/o stalled.
10$: cmp TASKAD(r0),#-1 ; End of list so far ?
beq 20$ ; Yes, fix the line up
tst IOSTALL(r0) ; No, anybody stalled intentionally?
bne 100$ ; Yes, just reschedule ourself
add #HDSIZE ,r0 ; No, check next task out
br 10$ ; Next please
20$: ;
.SPFUN #stswork,#XC.CONTROL,#CLRDRV,#0,#0,#1
100$: .MRKT #wtmark,#wttime,#wtdone,#10
mov charcount,wtcount ; Copy low 16 bits of char count.
unsave <r2,r1,r0> ; Pop registers
return ; Exit
.dsabl lsb
iddone: inc idle ; Has anything happended in a while?
cmp idle ,#3 ; Well?
ble 100$ ; No
clr idle ; Yes, force a .RSUM
clr suspend ; Clear suspended flag
.RSUM ; Force mainline to run
100$: .MRKT #idmark,#idtime,#iddone,#11 ; Reshedule
return ; And exit
.sbttl Connect for RT11 Multiple terminal service ONLY
; Rewitten: 08-May-86 14:49:40 Brian Nelson
.save
.psect mtdata ,rw,d,lcl,rel,con
chcount:.word 0
needxon:.word 0
mtbuff: .word 0
mttime: .word 0,0
mtwait: .word 0,1
.restore
.enabl lsb
domt: clr done ; Not done yet, please.
mov #10 ,chcount ; Count down for rt11 to do an XOFF
.SCCA #scca,#scca+4 ; No control C's please
clr needxon ; Don't need to send xon yet
calls noecho ,<#ttname> ; Don't want echoing please
calls ttyini ,<#ttname,#LUN.XK,#0>
tst r0 ; Did the initialization work ?
beq 1$ ; Yes
jmp 90$ ; No, exit
1$: calls ttyset ,<#ttname> ; Ok, set some useful things up
mov #mtbuff ,r3 ; A tiny one character buffer.
.print #msg ;
calls ttspeed ,<#ttname> ; ......
tst r0 ; This is getting tedious
bgt 5$ ; ...
message <Unknown>,cr ;
br 6$ ; And so on
5$: decout r0 ; A REAL speed that RT11 knows about
message ; CR/LF
6$: message <Type your local escape sequence to return to RT11>,cr
mov r3 ,r4 ; Compatibility with XM code
.sbttl Main loop for MT reading
10$: tst done
bne 100$ ; Exit
calls xbinrea ,<#LUN.XK,#-1> ; Try to get a charater from remote
tst r0 ; Did the read succeed?
bne 20$ ; No, try console terminal then
clrpar r1 ; Yes, drop any aprity bits please
clr @r3 ; Insure .asciz string here.
bisb r1 ,@r3 ; Yes, get the character and print
cmpb r1 ,#'S&37 ; Xoff?
beq 15$ ; Yes, ignore
movb r1 ,r0 ; Copy the data now.
.TTOUTR ; Dump the character
15$: call dumplo ; Dump to a log file perhaps
dec chcount ; Is it time to do a RT11 XOFF ?
bne 25$ ; No, wait a while then
mov #2 ,needxon ; Will need to send xon later
call sxoff ; Yes, send an xoff please
mov #10 ,chcount ; And reset the character counter
br 25$ ; And look for local terminal input
20$: tst needxon ; Really send an xon today?
beq 25$ ; No
dec needxon ; Don't overdo sending xon's please
call sxon ; No data, send an xon please
;
25$: bis #40000+10000+100+20,@#JSW ; Insure special modes
.TTINR ; Try to read something now
bcs 70$ ; No data, exit
movb r0 ,@r3 ; yes, get it and send it to the
bic #^C177 ,r0 ; insure no high bits are set.
cmpb r0 ,#12 ; Ditch LINE FEEDS Please.
beq 25$ ; A Line Feed, next please?
cmpb r0 ,conesc ; other system unless it's the escape
bne 50$ ;
mov #20*60 ,r1 ; Loop a bit for a read
30$: bis #40000+10000+100,@#JSW ; Insure special modes
.TTINR ; Try to read something now.
bcc 40$ ; Successfull read, exit
.TWAIT #twait,#short ; Wait a moment now.
sob r1 ,30$ ; Try again
br 70$ ; Nothing, ignore please
40$: bic #^C177 ,r0 ; Insure no high bits are set.
cmpb r0 ,#12 ; Ditch LINE FEEDS Please.
beq 30$ ; A Line Feed, next please?
movb r0 ,@r3 ; Must save it here!
cmpb r0 ,conesc ; Really send the escape ?
beq 50$ ; Yes
call concmd ; Yes, do the command
br 70$ ; No, next please
;
50$: setpar @r3 ,@r3 ; Insure correct outgoing parity now
calls binwri ,<r3,#1,#LUN.XK>; The data is for the remote system
tst duplex ; Full or half duplex connection?
beq 70$ ; Full
movb @r3 ,r0 ; Half duplex, echo the data now.
.TTOUTR ; Simple to do.
70$: ;
80$: br 10$ ; and back for more
90$: direrr r0 ; problems in getting the connection
100$: calls ttyfin ,<#ttname,#LUN.XK>
bic #40000+10000+100,@#JSW ; Get rid of special modes
.SCCA #scca,#0 ; Get rid of control C trapping
return ; And exit now.
.dsabl lsb
sxon: tst conflow
beq 100$
calls binwri ,<#$xon,#1,#LUN.XK>
100$: return
sxoff: tst conflow
beq 100$
calls binwri ,<#$xoff,#1,#LUN.XK>
100$: return
.sbttl concmd terminal emulation escape commands
.enabl lsb
concmd::mov r1 ,-(sp) ; Save it
movb @r4 ,r1 ; Get the character to check
bicb #^C177 ,r1 ; Must drop parity
scan r1 ,#200$ ; look for a match here
asl r0 ; word offsets
jsr pc ,@210$(r0) ; dispatch to the correct routine
100$: mov (sp)+ ,r1 ; Pop R1 and exit
return
.save
.psect rwdata ,rw,d,lcl,rel,con
200$: .byte 'C&137 ,'c!40 ; drop connection ctrl \ C
.byte 'I&137 ,'i!40 ; init the line
.byte 'Q&137 ,'q!40 ; quit logging but leave file open
.byte 'R&137 ,'r!40 ; resume logging if file is open
.byte 'X&137 ,'X!40 ; control Q and then thats all
.byte 'B&137 ,'b!40
.byte '? ,177 ; help, rub for send break
.byte 'H&137 ,'h!40
.byte 0
.even
210$: .word con.$ ; unknown escape command
.word con.c ,con.c ; drop connection
.word con.i ,con.i ; get modems attention
.word con.q ,con.q ; turn console logging off
.word con.r ,con.r ; turn it back on please
.word con.x ,con.x ; send XON
.word con.br ,con.br ; break
.word con.hl ,con.br ; print out commands
.word con.hl ,con.hl ; help
.restore ; Pop code psect context
.dsabl lsb ; Turn off current symbol block
con.$: movb $bel ,r0
.TTOUTR ; Beep a little
clc ; commands. Say it is not fatal.
return ; Bye
con.c: mov sp ,done ; Exit connection
return ; And return
con.i: calls ttydtr ,<#ttname> ; try to force DTR up on the line
clc ; And say it's NOT fatal
return ; Exit
con.q: bic #log$co ,trace ; turn off console logging
clc ; Successfull
return ; Exit
con.r: bit #log$op ,trace ; if the file is open do it
beq 100$ ; no
bis #log$co ,trace ; yes, enable this
100$: clc ; Success
return ; Exit
.enabl lsb
con.x: tst xk ; MT or XC/XL/CL today?
beq 30$ ; MT service
.SPFUN #200$,#XC.CONTROL,#CLRDRV,#0,#0,#1
mov #tlist ,r0 ; Ok, check for any i/o stalled.
10$: cmp TASKAD(r0),#-1 ; End of list so far ?
beq 20$ ; Yes, fix the line up
clr IOSTALL(r0) ; Clear task stalled flags
add #HDSIZE ,r0 ; No, check next task out
br 10$ ; Next please
20$: .WRITC #200$,#LUN.XK,#$xon,#1,#190$,#1
br 100$ ; Exit
30$: calls ttxon ,<#ttname> ; and try to clear our xoffed state
100$: clc ; Success
return ; Exit
190$: return ; AST write completion
.save
.psect rwdata ,d,lcl
200$: .word 0,0,0,0,0,0,0
.restore
.dsabl lsb
brkast: call con.br
mov #tsxbrk ,r0
EMT 375
return
con.br: calls senbrk ,<#ttname,#lun.ti>
clc
return
con.hl::.print #hlptxt
clc
return
.save
.psect rwdata ,rw,d,lcl,rel,con
hlptxt: .ascii /B Try to send a break to the remote/<cr><lf>
.ascii /C Connect back to the local Kermit-11/<cr><lf>
.ascii /I Drop and raise DTR (for RSTS only)/<cr><lf>
.ascii /Q Quit console logging. See SET LOG/<cr><lf>
.ascii /R Resume console logging. See SET LOG/<cr><lf>
.ascii /X Send XON and cancel any active XONs/<cr><lf>
.asciz /RUBOUT Try to fake a break to the remote/<cr><lf>
.ascii /? Print this message/<cr><lf>
.byte 0
.even
.restore
.sbttl dump i/o to a log file ?
; Passed: r3 buffer address
dumplo: bit #LOG$CO ,trace ; Is this enabled ?
beq 100$ ; No
bit #LOG$OP ,trace ; Is it open
beq 100$ ; No
save <r0,r1,r2,r3> ; Save work registers
strlen r3 ; Get size
mov r0 ,r2 ; Copy size
beq 90$ ; Nothing to do ?
10$: clrb r0 ; Avoid sign extension
bisb (r3)+ ,r0 ; Get the next character
mov #LUN.LO ,r1 ; Unit number
call putcr0 ; Thats it folks
sob r2 ,10$ ; Next please
90$: unsave <r3,r2,r1,r0> ; Pop registers and exit
100$: clc ; May as well say it worked
return ; Bye
.save
.psect rwdata
$xon: .byte 'Q&37,0
$xoff: .byte 'S&37,0
$bel: .byte 'G&37,0
.even
.restore
.end