L&8}YT,7 7 @d b` ,’\d@~5bߋb5b ,w5p\@ddUd5d,` w5bwx@ P,4RR`T TVUR5P%,Z PT R5P R (R5P%w w ,& +++ 7 w,L԰+w 7w  7|w ,rw \ĝZ7z+7N J z+G,r+!  L a8}YE, 7 * 7 " R PT T,& 2!*R@~5P5@P w ,L RTR R5P ,r T5T TT w b@, d`2!fd@~5b5@:, b5b b@dd5bj, H`2!f@ddw@d , !"d@~5b%w0!,a HR@ 7 w,a(w 7Jailylw  7|w s,aw \ĝ$  dR y8}Ud, %@Z{[lP}M]\Nk`K,& az^L~no|u,L 7 5x5@x7 h,r  w5x RAT' , V 5@P7 Z B& <, H7 B27 0R`T'V,  5R 5 x , !RT |w TeAw 4,0!jV $w `V $5x$$~E,V!$$~ $$~,|!$$ .TITLE TAPCPY 800 TO 1600 BPI TAPE COPY ; ; THIS PROGRAM COPIES 800 BPI NRZI TAPES TO PRODUCE ; 1600 BPI PE TAPES. ; R0 = %0 PC = %7 SP = %6 R5 = %5 MTC = 172522 MTCMA = 172526 MTWC = 172524 MTS = 172520 ; MAGCMD = 167544 MAGCMA = 167546 MAGWC = 167540 MAGST = 167542 ; READ = 1 MGCLR = 40000 CURDY = 200 ; MTCLR = 0w & x+r+7,@* D A  &DCc  ,w Dw  w  ' 7  r, Մ &w \w wXw w ,0 fw  w 7 wtwh,Vw  %+E eӂ wh,|H  =w XH A w L~,: w D3 w < w 4w < 7 w $,.7 w &7 7  \,w7  ww (b ww ?,ւw A B` %0,:օ w| Z77N J hI, b!&b0w & M,Fb@$ D A  &DCc  ,lbw Dw  w  ' 7  \,b &w \w wXw w ,b fw  w 7 wtwh,bw l %lE eJa wht,clH el =w XH A w L=,*c: w D3 w < w 4w < 7 w ,Pc.7 w &7 7 Xlel \j,vcw7  ww (b ww ),cw  ~ n j$@ p5@P+51,!x6'\RX010\,!0 &  d.ed& $ |,!wwd & 5xwF,"'0^1Y0T0O ,:" TdB Ԡ!Q  {,`" ee   zded $," ww PxEQ_RU,"R&@~5p % s,"&~ L  &~ P,"& L N',#~ ' 10000 WRITE = 4 TURDY = 1 GAP = 14 MATBSP = 12+1 MGBKSP = 200 MTEOF = 6+1 ; MAGEOF = 100000 START: CLR EOFCNT ST1: JSR PC,MAGCD CLR EOFCNT JSR PC,MTCMD BR START ; ; ; 800 BPI READ ; MAGCD: MOV #MGCLR,@#MAGCMD CLR @#MAGST MOV #4000,@#MAGWC MOV #BUFFER,MAGCMA MOV #READ,@#MAGCMD MOV  7wr|wh,`y E 7ӂwhb E Z, tP Iw 0-",% w  =w (7,$ =w e0w ,w %,@w ke=,w @w jwww=w  ,D w  vw <Ae0w ,w ,j׀ZTXw H- @D7x,> ,: 4,*w _,?w &7 w 7 77 ,   w %A B` %,c w| 7wr|wh,cy E 7hawhb E /,d thaP haIw 0-"x,4d% w  =w (7,Zd$ ha=w e0w ,w %,d@w ke=,dw @w jwww=w ,d w  vw <Ae0w ,w ,dZTXw H- @D7c,eha> ,: 4,*w 3,>e?w B  B `& ,D# N     w,j#   NߋLN N,# ,nlddWwE%,# e7e0t%E% e7e,#0t &  " 5x ,$$&~ $&~&d,($  & % 9,N$ &  %| w DR% ',t$edw S % RECORD , BYTE C,$OUNT , DUMPED IN m#$ EBCDICAS #100,R0 05$: SOB R0,05$ 10$: BIT #CURDY,@#MAGST BEQ 10$ 06$: TSTB @#MAGST BPL 06$ BIT #MAGEOF,@#MAGST BEQ 42$ TST (SP)+ JMP MTWEOF 42$: BIT #400,MAGST BPL 20$ MOV #MGCLR,@#MAGCMD MOV #MGBKSP,@#MAGCMD BIS #1,@#MAGCMD 12$: BIT #TURDY,@#MAGCMD BEQ 12$ BR MAGCD 20$: MOV #0 %7E ` , 1 W ֆ m7> ( y0hv؀V~cB:^֮LB֘,Vv4ט׶<׀Ԫԃl7gNR,|D D 7@7:%2. p,& w %=w ,w $B, w w ww  <, 7mw ,w %/w \,:  n,  L e`,`  !B !=L !6<,&7 w 7 77 ,de   w %0 %7E ` ,e 1l W ֆ m7 e yeeef\fbhlfchfvefc6gg~gf`hccc,ecdd e>edcNb2bl7gN{,fD D 7@7:%2. Z,*f& w %=w ,w $,,Pf w w ww  &,vf 7mw ,fw %/w \,f  nl  L exa ,f CII ASCII CHARS,$EBCDIC CHARS, TAPE READ ERROR *,% .1 .5 .,*%10 .15 .20 .25 .30 .35 .40 .45 :,P% .50 .55 .60 .65 .70 .75 .80 .8,v%5 .90 .95 .0100HEX ZONES - &HEX DIGIT &END-OF-FILER,u 6e%  w S,u 6 p  LY,vWp`v F V,6v( w e ,\v w`% e4000,R5 SUB @#MAGWC,R5 ASL R5 MOV R5,BYTECT BIT #10000,@#MAGST ;ODD CHARACTER ERROR BEQ RTSPC JMP ODD RTSPC: RTS PC MTCMD: CLR @#MTS MOV #MTCLR,@#MTC MOV #WRITE,@#MTC 03$: MOV BYTECT,@#MTWC NEG @#MTWC MOV #BUFFER,@#MTCMA 05$: BIS #1,@#MTC 10$: BIT #TURDY,@#MTS BEQ 10$ TST @#MTS BPL 44 Ԥ ,!44  p,% w .  @w @,,ـ % % w  ww X, D  &6,C@AEPA&fw w /w 8,Dڀw Lw   ` ,jE ` Z J ,ڰ w8`%w 71U&&E,w f7HE(%O,ڊ  p%w Z׭,$U,(ۮ7 !aB !a=L !6,g4xa4 a l!4xaa4 a ,4g% w .  @w @,Zg % % w  ww B,g D  & ,gC@AEPA&fw w /w #,gw Lw   ` ,gE ` Z J ,h w8ؗw 71U&&E,>hw f7HEO,dh  pa~w Z׭,h,v%  ,ve 6 U 5s,v B l7 6,vw w@A% 5%0,wUz%9UnUhE7^7 XmF,@wVPw JmJD <:v42V,fwv$"m"w mUl,w A w B,wB h-Cҕ0~DDc%C ,wBr'72 r EU0,wd~   V7  MTCMPT MOV #-1,@#MTWC MOV #MATBSP,@#MTC 20$: BIT #TURDY,@#MTS BEQ 20$ MOV #GAP,@#MTC BR 03$ MTCMPT: RTS PC ; MTWEOF: INC EOFCNT MOV #MTEOF,@#MTC 53$: BIT #TURDY,@#MTS BEQ 53$ CMP #2,EOFCNT BHI 63$ HALT 63$: JMP ST1 EOFCNT: .WORD 0 BYTECT: .WORD 0 BUFFER: .BLKW 8192. ODD: DEC BYTECT w Dŝŝ>,NEw$rt wft!,t w w Jw @e:%ĕ,t72 Ԩw Bw .,e` w ;w ĝw  ,wf&f >, 4ӯ,2 2#0#7&#"#w K,Xr#5 ##g"b"1,~V  <ӄ !%&%, &e N @ e0w & , fU,h7w Dŝŝ),hEwrt wft!xay,h w w Jzl{lw @e:%ĕ,"itxa72 aaw Bw .),Hie` w ;w ĝxaw ,niwVaf&f ,i4xaaxaY,i 77w ,ir5|gtbr,jV  <axa !%&,,j  ,$x6A  Uwx B @ ,JxA e@ UwV&f&  ,px @ABAc@e !~  ,x@AB ~ @AB /,x~ BCE @E  ~ ,x BC D ~ 6m y `,y nxf 7 w,yNw 7$yCSw  7|w ,yw \ĝZ77N J ~G,y!z0w & =, z@J D A  ;DECREMENT BYTE COUNT JMP RTSPC .END START  ",7"t"p"E , w   w ׭6"l,<ݕ ^w Uw wn n%,bj  7,XR-P ,Dw@ 78 %(! ,݄  %??,w N%w 77,w Z e0w ,w , ްw p,F Cå å$ נA  ~,l  &e N @ e0w & ,Rj ha ,xj7E -,j w   w ׭m,j ^w Uw Jawn n,jj  7,haXRha-P ,kDw@ 78 %(! ,6k  %??l,\kllw N%w 77,kw Z e0w ,w ,kw pt,k Cå å$ &DCc  ,Fzw Dw  w  ' 7  j,lz &w \w wXw w ,z fw  w 7 wtwh,zw } %E e$y wh,zvH ? =w XH A w Lh,{: w D3 w < w 4w < 7 w ,*{.7 w &7 7 2? \,P{w7  ww (b ww 7,v{w A B` %),{ w| 7wr|wh ,{y E 7Bywhb ; UPDATE 28-APR-75 MTTOJT .TITLE TAPCPY 1600 TO 800 BPI TAPE COPY ; ; THIS PROGRAM COPIES BPI TAPES TO PRODUCE ; 800 BPI TAPES. ; R0 = %0 PC = %7 SP = %6 R5 = %5 MTC = 167544 MTCMA = 167546 MTWC = 167540 MTS = 167542 ; MAGCMD = 172522 MAGCMA = e`  , Ëנe ee e ѐ  @(, ODT-11R V004A` BE, *;/\ $G _<^,OWEBP@>SRC-FI!XASPMCFRB,,?> נA  i,k  e` Ll c,l Ëנe ee e ѐ@l  @(},Tl ODT-11R V004AJ zlBE,l *;/\ $G _<^,OWEBP@>SRC-FI!XASPMlCFRBl,Ja)pa( # E K,{ tByP ByIw 0-",|% w  =w (7,4|$ By=w e0w ,w %,Z|@w ke=,|w @w jwww=w ,| w  vw <Ae0w ,w ,|ZTXw H- @D7q,|By> ,: 4,*w P,}?w &7 w 7 77 ,>}   w %0 %7E ` ,d} 1a W ֆ $ 172526 MAGWC = 172524 MAGST = 172520 ; READ = 3 MGCLR = 10000 CURDY = 1 ; MTCLR = 40000 WRITE = 2 TURDY = 200 GAP = 10 MATBSP = 200 MGBKSP = 12+1 MTEOF = 40000 ; MAGEOF%; UPDATE SPECIAL 16,800 BUFFER/RECORDS ; UPDATE 21-FEB-74 TAPDUM.S02 S02 ; UPDATE 10-FEB-74 TAPDUM.S01 S01 ; UPDATE 25-JAN-74 TAPDUM .TITLE TAPDUM TAPE DUMP ;******* T A P E D U M P R O U T I N E ******* ; ; HANDLES UP TO A MAXIMUM OF 4096 BYTES PER RECORD. ; WILL DUMP VARIABLE LENGTH RECORDS FROM MAG TAPE TO THE LINE PRINTER. ; ONLY THE DATA BYTES READ ARE DUMPED AN&8}Y(A(.7 7 @d b`w (.&fd@~5bߋb5b  f.Lw5b@ddUd5d0  b.r` w5bwx@ P2.RR`T TVUR5P} . PT R5P R *R5P%w AA w5'm7/ } y}}}}6~zF~`{B~}~{\X~:r{z{{G,}{j|||}|z(z zl7gN ,}D D 7@7:%2. i,~& w %=w ,w $:,*~ w w ww  4,P~ 7mw ,v~w %/w \,~  n  L eRyJ,~  !`yB !`y=L !6%,~4Ry4 dy !4Ryvy4 dy =,% w .( = 40000 START: CLR EOFCNT ST1: JSR PC,MAGCD CLR EOFCNT JSR PC,MTCMD BR START ; ; ; 1600 BPI READ ; MAGCD: MOV #MGCLR,@#MAGCMD CLR @#MAGST MOV #4000,@#MAGWC NEG @#MAGWC MOV #BUFFER,MAGCMA MOV #READ,@#MAGCMD MOV #100,R0 05$: SOB R0,05$ 10$: BIT #CURDY,@#MAGST )D A BYTE COUNT IS ALSO LISTED. ; NORMALLY READS AND DUMPS ASCII DATA UNLESS OTHERWISE REQUESTED. ; READS SUCCESSIVE RECORDS AND DUMPS THEM UNTIL REQUESTED TO HALT. ; IF A RECORD EXCEEDS 4096 DEC CHARS, ONLY THE FIRST 4096 CHARS DUMPED. ; ; ; OPTIONS AND SWITCH BIT SETTINGS ARE AS FOLLOWS: ; SWITCH BIT: ; 0-3: DUMP MAG TAPE NO IN THESE SWITCHES S01 ; 8: EBCDIC TO ASCII CONVERSION (MT READ TO LP PRINT) ; 10: STOP DUMP ON END-OF-FILE *ESS OF THE ; ;CURRENTLY EXECUTING TASK; 0=NONE ACTIV TASKS: .WORD NLTASK ; TASK NUMBER OF LARGEST TASK IN SYSTEM QTAB LEVELS: .WORD NPRIOR ;NUMBER OF PRIORITY LEVELS IN SYSTEM ; QUEU STACK: .WORD 0 ; ADDRESS OF SYSTEM STACK POINTER QUEU ; QUEU ; +  @w @$,4 % % w  ww P,Z D  &.,C@AEPA&fw w /w 1,w Lw   ` ,E ` Z J , w8w 71U&&E,w f7HEO,>  pdyw Z׭,dU,7w Dŝŝ7,EwBrt,BEQ 10$ BIT #MAGEOF,@#MAGST BEQ 42$ TST (SP)+ JMP MTWEOF 42$: TST @#MAGCMD ; ANY ERRORS BPL 20$ MOV #-1,@#MAGWC MOV #MGCLR,@#MAGCMD MOV #MGBKSP,@#MAGCMD ; 12$: BIT #CURDY,@#MAGST BEQ 12$ BR MAGCD 20$: NEG @#MAGWC ; NO ERRORS AFTER READ-; 11: ADVANCE TAPE FORWARD BEYOND NEXT END-OF-FILE AND STOP ; 12: PRINT DOUBLE SPACE ; 13: BYPASS RETRY ON MAG TAPE READ ERROR ; 14: STOP IMMEDIATELY AND REWIND TAPE ; 15: STOP IMMEDIATELY ; ; PROGRAMMER: 65 ; DATE: 2/7/73 ; ;************************************************* .PAGE ;*************** ; GLOBL'S ;*************** .GLOBL BASCNV .GLOBL ABSCNV ;*************** ; EQUATES ;***************. QTAB ; QTAB ; THE TABLES 'PPTAB' (BYTE), 'LAST' (WORD), AND 'FIRST' (WORD) ALL HAVE QTAB ; A MAXIMUM NUMBER OF SYSGENABLE ENTRIES ABOVE WHICH ADDITIONAL CODE QTAB ; MUST BE ADDED BEFORE THEY WILL PROPERLY ASSEMBLY. TO INSURE THIS, QTAB ; THE FOLLOWING CHECK IS PROVIDED. THE NUMBER SUBTRACTED FROM 'NPRIOR' QTAB ; IS THE VALUE ABOVE WHICH NEW CODE MUST BE ADDED. QTAB ; / wft!Ry,ր w w JTUw @e:%ĕ,tRy72 dydyw Bw .b,"e` w ;w ĝRyw ,Hw0yf&f .,n4RyvyRy, }}7}7}}w l,r}5}}g}b}P,V  <vyRy !%&, &e N @ e0w & ,, By "},R7}}}E0 BIT #1,@#MAGWC BEQ 50$ INC @#MAGWC 50$: MOV #4000,R5 SUB @#MAGWC,R5 ASR R5 MOV R5,BYTECT ; ; ; RTSPC: RTS PC MTCMD: CLR @#MTS MOV #MTCLR,@#MTC BR03: 03$: MOV BYTECT,@#MTWC MOV #BUFFER,@#MTCMA 05$: MOV #WRITE,@#MTC MOV #100,R0 04$: SOB R0,04$ 10$: 1 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 SWR = 177570 TPB = 177566 MTCLR = BIT12 ; CLEAR MT CONTTROL EOF = BIT14 ; END OF FILE FLAG FROM MT (MTS) BC = 16800. ; ******* SPECIAL BYTE COUNT MTER = BIT15 ; ERROR FLAG FROM MT (MTC) MTC = MAGCMD ; MTCMA = MAGADR ; MTBRC = MAGWC ; MTS = MGSTAT ; BIT12 2 QTAB .IFG NPRIOR-16 ; CURRENT MAXIMUM NUMBER OF PRIORITED QTAB XXXXXX QTAB .ENDC QTAB ; QTAB ; THE FOLLOWING TABLE, PPTAB, IS USED TO CONTAIN THE QTAB ; DESCRIPTORS OF EACH SOFTWARE PRIORITY LEVE3 ,x w   w ׭|m, ^w Uw $ywn n,Ăj  7,ByXRBy-P ,Dw@ 78 %(! ,  %??_,6`^w N%w 77,\w Z e0w ,w  ,w p, Cå å$ נA  w,΃  e` & , Ëנe ee4 BIT #TURDY,@#MTS BEQ 10$ BIT #40000,@#MTS ; EOT? BEQ OK HALT ;HALT IF EOT OK: BIT #4000,@#MTS ;ERROR? BEQ MTCMPT ;NO ERROR CLR @#MTS MOV #MTCLR,@#MTC ;BACKSPACE MOV #MATBSP,@#MTC 20$: BIT #TURDY,@#MTS BEQ 205= 10000 ; BIT14 = 40000 ; BIT15 = 100000 ; ; MAGWC = 172524 ; MTBRC MGSTAT = 172520 ; MTS MAGCMD = 172522 ; MTC MAGADR = 172526 ; MTCMA ; LPS = LPCMD ; LPB = LPSTAT ; LPCMD = 177514 ; LPSTAT = 177516 ; ; READ = 1*2 ; BKSP = 5*2 ; REWD = 7*6L. PPTAB IS A QTAB ; BYTE TABLE AND CONTAINS 1 ENTRY FOR EACH LEVEL. QTAB ; THE PROPERTY OF EACH LEVEL IS: QTAB ; +1 = TIME SLICE PRIORITY (CORE OR OVERLAY) QTAB ; 0 = FIXED TASKS (CORE OR OVERLAY) QTAB ; -1 = FREE TASKS (CORE OR DYNAMIC OVERLAY) QTAB ; QTAB PPTAB = e ѐ  @(,. ODT-11R V004AX TBE,Z *;/\ $G _<^,OWEBP@>SRC-FI!XASPMCFRB,$y7Jy6R E$ MOV BYTECT,@#MTWC MOV #BUFFER,@#MTCMA MOV #MTCLR,@#MTC MOV #GAP,@#MTC JMP BR03 MTCMPT: RTS PC ; MTWEOF: MOV #MTCLR,@#MTC INC EOFCNT MOV #4,@#MTC MOV #100,R0 52$: SOB R0,52$ 53$: BIT #TURDY,@#MTS BEQ 53$ CMP #2,EOFCNT BHI 63$ F2 ; SPFWD = 4*2 ; UNIT0 = 0 ; UNIT1 = 1*256. ; CURDY = BIT7 ; ; BIT7 = 200 ; FF = 14 ; LF = 12 ; LL = 131. ; LINE LENGTH - 1 ;*************** ; CONSTANTS AND TEMPORARY STORAGE ;*************** NOTRYS: .WORD 0 ERRFLG: .WORD 0 BYTECT: .WORD 0 CHARCT: .WORD 0 RECCT: .WORD 0 MAGBP:E .-1 ; TAKE CARE OF LEVEL 0 QTAB .BYTE PRIP01,PRIP02 ; ADD MORE CODE IF NPRIOR > 16 QTAB .BYTE PRIP03,PRIP04 ; QTAB .BYTE PRIP05,PRIP06 ; QTAB .BYTE PRIP07,PRIP08 ; QTAB .BYTE PRIP09,PRIP10 ; QTAB .BYTE PRIP11,PRIP12 ; G**** ; ; ; EXTERNAL REFERENCES AND PROGRAM ENTRY POINTS ; .REF QUEUE,QSAVEI,UNSPND,RESTOR,QTIME,DQTIME,DSPTCH .REF ACTIVE,IOSTAT,PUSHR,POPR,ERRTYP,DISCIO,PFRITE .REF LOGMAX,PHYDEV,ALTDEV .DEF TTYOUT,TTYIN,TTINIT .DEF PRTINT,KBDINT .DEF TTICSR,TTIDBR ;USED BY POWER FAIL ROUTINE ; .CSECT ; ; ; TTYIO PARAMETERS AND SYMBOLS ; .IFG NTTYS-8. XXXXXX ;CREATE ASSY ERROR I""""DDDD """@DDDDDDDDDDDDDDADDB CA_K1tTd_K]8}UK 3A_{NtTd_|E8}U{!#A_^""$D;DDDDDDDDDDDDDDa ͋,L  B8w&B ` % & }&*C$$Βe E%>k  aʋaՀ$ & * P$ ΋Ί   ΋   d Ί  ( 1'u  Q$f $5@ U C΋ Cb M΋U@ U &  B" .&0 M &0 & M 0 & HALT 63$: JMP ST1 EOFCNT: .WORD 0 BYTECT: .WORD 0 BUFFER: .BLKW 8192. .END START J .WORD 0 BYTCT: .WORD 0 MAXCCT: .WORD 0 WORK1: .WORD 0 .EVEN EBCTAB: .BYTE 005,045,000,024,025 EBCDIC: .BYTE 100,132,177,173,133,154,120,175,115,135 .BYTE 134,116,153,140,113,141,360,361,362,363 .BYTE 364,365,366,367,370,371,172,136,114,176 .BYTE 156,157,174,301,302,303,304,305,306,307 .BYTE 310,311,321,322,323,324,325,326,327,330 .BYTE 331,342,343,344,345,346,347,350,351 EBCEND =.-1 .PAGE ;*******KF NTTYS GT 8. .ENDC .IFZ NDISCS ;IF THERE ARE ZERO DISCS IN SYSTEM, ;DISALLOW MESSAGE BUFFERING MSGBUF = 0 .ENDC .IFL 1-MSGBUF XXXXXX ;CREATE ASSY ERROR IF MSGBUF NOT 0 OR 1 .ENDC TFOPTN = 40 ;TIMER MODULE FLAG OPTION TJOPTN = 20 ;TIMER MODULE JSR TO TIMEOUT COMPLETE ;ROUTINE OPTION SAVE = 3 LASK CANNOT BE NEGATIVE .ENDC .IFG NLTASK-MXTASK ; QTAB XXXXXXXX ;NTASK MUST BE <= MXTASK .ENDC ; ; THE FOLLOWING IS A LIST OF PRIORITY PROPERTIES ; +1 = TIME SLICE PRIORITY (CORE OR OVERLAY) ; 0 = FIXED OVERLAY TASK (MAY BE CORE) ; -1 = FREE TASKS (CORE OR DYNAMIC OVERLAY) ; PRIP01 = 0 ; PRIORITY PROPERTY LEVEL 1 PRIP02 = MMATION. WORD 1 CORRESPONDS TO PRIORITY ; LEVEL 1 (HIGHEST PRIORITY); WORD 2 CORRESPONDS TO PRIORITY ; LEVEL 2 (SECOND HIGHEST PRIORITY); ETC. THE FIRST WORD OF EACH ; TABLE IS A DUMMY TO ALLOW FOR THE NONEXISTENT PRIORITY LEVEL 0. ; ; FIRST POINTS TO THE PROGRAM HEADER OF THE FIRST TASK IN THE ; ASSOCIATED PRIORITY LEVEL THREAD; THE FIRST WORD OF THAT ; PROGRAM HEADER POINTS TO THE NEXT TASK IN THE THREAD; AND ; SO ON. A ZERO INDICATES THE END OF N******** ; START HERE ;*************** TAPDUM: ;ENTRY POINT CLR RECCT ;RESET REC COUNTER JSR PC,TOP ;SKIP TO TOP OF NEW PAGE START: BIT #140000,@#SWR ;STOP TEST BEQ NOSTOP BIT #40000,@#SWR ;REWIND TEST BEFORE STOP BEQ 1$ CLR RECCT ;RESET REC COUNTER JSR PC,TOP ;SKIP TO TOP OF NEW PAGE MOV #REWD,R5 ; REWIND TO ;USED AS A MNEMONIC FOR 000003 TRAP INST .IFL 1-ARG XXXXXX ;CREATE ASSY ERROR IF ARG NOT 0 OR 1 .ENDC TASKNO = 13.+ARG+ARG ;LOCN OF TASK NO IN A TASK HEADER .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM ; ; ; DEFINITION OF FILE ID'S FOR DISC BUFFERED MESSAGES ; FIDN0 = 20. ;FILE FOR NORMAL MESSAGES, UNIT 0 FIDP0 = 21. ;FILE FOR PRIORITY MESSAGES, UNIT 0 FIDN1 =P0 ; PRIORITY PROPERTY LEVEL 2 PRIP03 = 1 ; PRIORITY PROPERTY LEVEL 3 PRIP04 = 1 ; PRIORITY PROPERTY LEVEL 4 PRIP05 = 0 ; PRIORITY PROPERTY LEVEL 5 PRIP06 = -1 ; PRIORITY PROPERTY LEVEL 6 PRIP07 = 0 ; PRIORITY PROPERTY LEVEL 7 PRIP08 = 1 ; PRIORITY PROPERTY LEVEL 8 PRIP09 = 1 ; PRIORITY PROPERTY LEVEL 9 PRIP10 = 0 QTHE QUEUE, AND THE 'LAST' ; TABLE CONTAINS THIS ADDRESS. ; LAST=. .WORD 0 ; BUMP LOCATION COUNTER OVER LAST(0) QTAB .WORD FIRST+2. ; INSERT MORE VALUES IF NPRIOR > 16. QUEU .WORD FIRST+4 .WORD FIRST+6 .WORD FIRST+8. .WORD FIRST+10. .WORD FIRST+12. .WORD FIRST+14. .WORD FIRST+16. .WORD FIRST+18. .WORD FIRST+20. .WORD FIRST+22. RAPE JSR PC,GO 1$: HALT ;NOW STOP JMP START ;GO AGAIN NOSTOP: ;READ NEXT RECORD BIT #004000,@#SWR ;ADVANCE TAPE BEYOND NEXT EOF TEST BEQ 2$ MOV #MTCLR,@#MAGCMD ; RESET CONTROLLER MOV #BC,@#MAGWC ; MOV #MAGBUF,@#MAGADR MOV #READ,R5 JSR PC,GO ;READ A RECORD BIT #EOF,@#MGSTAT ; EOF ? BNE S 22. ;FILE FOR NORMAL MESSAGES, UNIT 1 FIDP1 = 23. ;FILE FOR PRIORITY MESSAGES, UNIT 1 FIDN2 = 24. ;FILE FOR NORMAL MESSAGES, UNIT 2 FIDP2 = 25. ;FILE FOR PRIORITY MESSAGES, UNIT 2 FIDN3 = 26. ;FILE FOR NORMAL MESSAGES, UNIT 3 FIDP3 = 27. ;FILE FOR PRIORITY MESSAGES, UNIT 3 FIDN4 = 28. ;FILE FOR NORMAL MESSAGES, UNIT 4 FIDP4 = 29. ;FILE FOR PRT ; PRIORITY PROPERTY LEVEL 10 PRIP11 = 0 ; PRIORITY PROPERTY LEVEL 11 PRIP12 = 1 ; PRIORITY PROPERTY LEVEL 12 PRIP13 = -1 ; PRIORITY PROPERTY LEVEL 13 PRIP14 = -1 ; PRIORITY PROPERTY LEVEL 14 PRIP15 = -1 ; PRIORITY PROPERTY LEVEL 15 PRIP16 = 0 ; PRIORITY PROPERTY LEVEL 16 .PAGE ; ; QUEUE SYSGEN EQUATE CARDS ; DPRTY = 1 ;DYNAMIC PRIORITYU .WORD FIRST+24. .WORD FIRST+26. .WORD FIRST+28. .WORD FIRST+30. .WORD FIRST+32. .=LAST+NPRIOR+NPRIOR+2 ;GET RID OF ZEROES XE DON'T ; NEED FIRST=. .WORD 0 ; BUMP LOCATION COUNTER OVER FIRST(0). .WORD 0,0,0,0,0,0,0,0 ;ADD MORE ZEROES IF NPRIOR > 16 .WORD 0,0,0,0,0,0,0,0 .=FIRST+NPRIOR+NPRIOR+2 ;GET RID OF ZEROES WE DON'T ; V 4$ ;YES CLR RECCT ;NO, RESET REC CT BR START 4$: JSR PC,PRTBLK ;PRINT A BLANK LINE MOV #EOFM,R1 ;PRINT EOF MESSAGE MOV #11.,R5 JSR PC,PRINT HALT CLR RECCT ;RESET REC CT BR START 2$: MOV #7,NOTRYS ; 7 RETRYS NORMAL CLR ERRFLG 1$: MOV #MTCLR,@#MAGCMD ; RESET CONTROLLER MOV #-BC,@#MAGWC WIORITY MESSAGES, UNIT 4 FIDN5 = 30. ;FILE FOR NORMAL MESSAGES, UNIT 5 FIDP5 = 31. ;FILE FOR PRIORITY MESSAGES, UNIT 5 FIDN6 = 32. ;FILE FOR NORMAL MESSAGES, UNIT 6 FIDP6 = 33. ;FILE FOR PRIORITY MESSAGES, UNIT 6 FIDN7 = 34. ;FILE FOR NORMAL MESSAGES, UNIT 7 FIDP7 = 35. ;FILE FOR PRIORITY MESSAGES, UNIT 7 ; ; ; OUTPUT BUFFER SIZE DEFINITION FOR MESSAGE BUFFERED DISC SYSTEM X ASSIGNMENT; IF ; DPRTY = 0, THE ALL TASK PRIORITIES ; WILL BE RETRIEVED FROM TASK TABLE. ; IF DPRTY = 1, THEN CALLING PROGRAM ; CAN SELECT PRIORITY. ARG = 1 ;ARGUMENT OPTION; IF ARG = 1, THEN ; THE CALLING PROGRAM CAN PASS AN ; ARGUMENT TO THE QUEUED TASK. RGSAVE = 1 ;REGISY ;NEED ; ; THE FOLLOWING TABLE IS THE SYSTEM TASK TABLE. THIS TABLE IS ; BROKEN DOWN INTO 6 SUB-TABLES. THAT WAY THE TASK NUMBER CAN ; BE USED AS AN INDEX INTO THE APPROPRIATE SUB-TABLE. THESE ; TABLES ARE: ; ; 1. HEADER - CONTAINS THE ADDRESS OF PROGRAM HEADER FOR ; EACH TASK (WORD TABLE) ; 2. TSTAT - CONTAINS THE TASK STATUS (BYTE TABLE) ; 0 = QUIESCENT (INACTIVE) ; Z; SET BYTE COUNT MOV #MAGBUF,@#MAGADR ;ADDR OF MAG TAPE BUFFER MOV #READ,R5 ; READ COMMAND JSR PC,GO ;READ A RECORD BIT #MTER,@#MTC ; READ ERROR ON MT ? BEQ GOON ;NO IF BRANCH INC ERRFLG ;YES BIT #20000,@#SWR ;BYPASS RETRY TEST BNE GOON ;YES DEC NOTRYS ;TRY AGAIN TEST BLE GOON ;NO MORE MOV [ ; OBUFSZ = 128. ;MINIMUM SIZE OUTPUT BUFFER(1 SECT/MSG) DNWRDS = 64. ;NO. OF WORDS IN DISK TRANSFERS .IFGE DBUFSZ-2 ;IS SECTOR COUNT 2? OBUFSZ = OBUFSZ+128. ;YES, ADD 64 WORDS DNWRDS = DNWRDS+64. .ENDC .IFGE DBUFSZ-3 ;IS SECTOR COUNT 3? OBUFSZ = OBUFSZ+128. ;YES, ADD 64 WORDS DNWRDS = DNWRDS+64. .ENDC .IFG DBUFSZ-3 ;IS SECTOR COUNT GT 3? XXXXXX \TER SAVE OPTION. 1 = SAVE ;REGISTERS, 0 = DON'T SAVE 'EM. ; ; ***** NOTE: IF DPRTY = 0 OR ARG = 0, THEN THE CORRESPONDING ; ---- ARGUMENT SHOULD BE OMITTED FROM THE CALLING LIST. .IFL DPRTY ; XXXXXXXX ;CREATE ASSEMBLY ERROR IF DPRTY ISNT .ENDC ;ZERO OR ONE. .IFG DPRTY-1 ; XXXXXXXX ; .ENDC ; .IFL ] 1 = QUEUING IN PROGRESS. ; 2 = QUEUED ; 3 = ACTIVE ; 4 = SUSPENDED - VOLUNTARY ; 5 = SUSPENDED - INVOLUNTARY ; 6 = DISABLED ; 7 = ABORTED ; 8 = REQUEST PENDING WITH DQOVLY (RPOM) QTAB ; 3. IOSTAT - CONTAINS THE TASK'S I/O STATUS (BYTE TABLE): ; 0 = NO I/O PENDING ; N = I/O IN PROGRESS (N = 1,2,...) ; ^ #MTCLR,@#MAGCMD ; RESET CONTROLLER MOV #-1,@#MAGWC ;BACKSPACE 1 RECORD S02 MOV #BKSP,R5 ; JSR PC,GO JMP 1$ ;TRY TO READ REC AGAIN GOON: INC RECCT ;BUMP REC READ COUNTER MOV @#MAGWC,BYTECT ; GET BYTE COUNT ADD #BC,BYTECT ; OF RECORD JSR R5,BASCNV ;GET BYTE COUNT .WORD BYTECT ;INTO PRINT HEADER FOR E_ ;YES, CREATE ASSY ERROR, DBUFSZ GT 3!! .ENDC OMSGSZ = OBUFSZ-16. ;OUTPUT MSG SIZE -- MAXIMUM NO OF CHAR ; ALLOWED IN OUTPUT ; MESSAGE (MSG BUFFER ; SYSTEM ONLY) .ENDC ; ; ; MISCELLANEOUS SYMBOLS ; CR = 15 ;CARRIAGE RETURN LF = 12 ;LINE FEED RO `ARG ; XXXXXXXX ;CREATE ASSEMBLY ERROR IF ARG IS NO .ENDC ;ZERO OR ONE .IFG ARG-1 ; XXXXXXXX ; .ENDC ; .IFL RGSAVE ; XXXXXXXX ;CAUSE AN ASSEMBLY ERROR IF .ENDC ;RGSAVE ISN'T 0 OR 1 .IFG RGSAVE-1 ; XXXXXXX ; .ENDC ; $ABMESa4. TPRTY - TASK SOFTWARE PRIORITY LEVEL (BYTE TABLE). ; 5. BSIZE - NUMBER OF CORE SEGMENTS REQUESTED (BYTE) QTAB ; 6. IFD - CONTAINS INDEX INTO FILE DIRECTORY IF BIT 15=0; ; OTHERWISE THE FILE ID. USED BY THE OVERLAY MONITOR. ; (WORD TABLE). ; ; HEADER=. ;PROGRAM HEADER ADDRESS .=.+TASMAX+TASMAX+2 ;PART OF SYSTEM TASK TABLE ; TSTAT=.-1 ;TASK STATUS TABLE .=.+TASMAX bACH REC .WORD BCT .WORD 4 JSR R5,BASCNV ;NOW RECORD COUNT .WORD RECCT .WORD RCT .WORD 4 BIT #400,@#SWR ;EBCDIC OR ASCII IN HEADER BEQ 10$ MOV #6,R2 11$: MOVB EBC-1(R2),DTY-1(R2) SOB R2,11$ BR 12$ 10$: MOV #6,R2 1$: MOVB ASC-1(R2),DTY-1(R2) SOB R2,1$ 12$: TST ERRFLG ;ANY TAPE READ ERRORS c= 177 ;RUBOUT ; ; ; ERROR CODES ; ERRQL = 21. ;LIST NOT QUEUEABLE, THREAD WORD .NE. 1 ERRLDN = 22. ;INVALID LOGICAL DEVICE NUMBER IN LIST ERRPDT = 23. ;INVALID PHYSICAL DEVICE TYPE IN LIST ERRET = 24. ;INVALID EXIT TYPE IN LIST ERRLEV = 25. ;INVALID PRIORITY LEVEL IN LIST ERRMSZ = 26. ;MESSAGE SIZE TOO LARGE ERROTO = 27. ;OUTPUT/ECHO d = 3 ; THREE ABORT MESSAGE BUFFERS ABRT .IFL $ABMES ; $ABMES MUST BE => 0. XXXXXX ; ABRT .ENDC ; PSTP ; THE SYSGEN PARAMETER '$PST CONTROLS THE EXECUTION PATH*PSTP ; DURING A TASK ERROR. PSTP ; = -1 ROS + USER ROUTINES e ;PART OF SYSTEM TASK TABLE ; IOSTAT=.-1 ; I/O STATUS TABLE .=.+TASMAX ;PART OF SYSTEM TASK TABLE ; TPRTY=.-1 ;TASK PRIORITY TABLE .=.+TASMAX ;PART OF SYSTEM TASK TABLE .IFNZ OVRLAY ;DON'T DO IT IF WE AIN'T GOT OVERLAY QTAB BSIZE=.-1 ; NUMBER OF CORE SEGMENTS QTAB .=.+MAXOVR ; THIS TASK NEEDS QTf BEQ 2$ ;THEN SAY SO IN HEADER LINE MOV #17.,R2 ;YES 3$: MOVB TRE-1(R2),RER-1(R2) SOB R2,3$ BR 4$ 2$: MOV #17.,R2 ;NO 5$: MOVB NTRE-1(R2),RER-1(R2) SOB R2,5$ 4$: JSR PC,PRTBLK ;PRINT A BLANK LINE JSR PC,PRTBLK ;PRINT A BLANK LINE MOV #HDMES,R1 ;NOW PRINT HEADER MOV #64.,R5 JSR PC,PRINT BIT #EOF,gTIMEOUT; ALTERNATE DEVICE ;SELECTED IF AVAILABLE ERRITO = 28. ;INPUT/OPERATOR RESPONSE TIMEOUT; ;ALTERNATE OPERATOR SHOULD BE SELECTED, ;REQUEST IS DEQUEUED ; ; ; SYSGEN TTY INTERRUPT VECTOR ADDRESSES, CONTROL STATUS REGISTER ; ADDRESSES AND DATA BUFFER ADDRESSES ; TT0IIV = 60 ;PHYSICAL UNIT 0 INTPUT INTERRUPT VECTOR TT0ICS = 177560 h PSTP ; = 0 ROS PSTP ; = +1 USER PSTP ; PSTP $PST = 0 ; PSTP ; PSTP .PAGE ;FOLLOWING ARE SYSGEN PARAMETERS FOR THE TIMER AND CALENDAR ROUTINES ; NORMAiAB IFD=.-2 ;OVERLAY EXTENSION OF TASK TABLE .=.+MAXOVR+MAXOVR ;CONTAINS INDEX INTO FILE DIRECTORY ;IF BIT 15 = 0; OTHERWISE, FILE ID .ENDC .EVEN ;TAKE CARE OF ODD BYTES .PAGE ;*********************************************************************** ; * ; Q U E U E j@#MGSTAT ; EOF ? BNE EOFF ; YES BIT #400,@#SWR ;NO, EBCDIC READ TEST BNE EBBSEE ;YES ;USE BYTECT NOW FOR LOOP COUNTER MOV #MAGBUF,MAGBP ;ASSUME ASCII READ MOV BYTECT,BYTCT MOVB #'0,DIGITP+120. MOVB #'1,DIGITP+121. MOVB #'0,DIGITP+122. MOVB #'0,DIGITP+123. 15$: JSR PC,PRTBLK ;PRINT A BLANK LINE JSR PC,SUPHEX ;SET UP HEk;PHYSICAL UNIT 0 INPUT CNTRL STATUS REG TT0IDB = 177562 ;PHYSICAL UNIT 0 INPUT DATA BUFFER REG TT0OIV = 64 ;PHYSICAL UNIT 0 OUTPUT INTERRUPT VECTOR TT0OCS = 177564 ;PHYSICAL UNIT 0 OUTPUT CNTRL STATUS REG TT0ODB = 177566 ;PHYSICAL UNIT 0 OUTPUT DATA BUFFER ; TT1IIV = 340 ;UNIT 1 ADDRESSES TT1ICS = 160200 TT1IDB = 160202 TT1OIV = 344 TT1OCS = 160204 TT1ODB = 160206 ; TT2IlLLY THE BASE PERIOD FOR THE TIMERS IS THE INTERRUPT PERIOD, AND ; IF THAT PERIOD IS DESIRED FOR USE BY ANY TIMER MODULE, "RESO" MUST BE ; SET TO 1, AND THAT RESOLUTION (ZERO) SPECIFIED BY THOSE MODULES. ; IF IT IS DESIRED TO MAKE THE BASE PERIOD COARSER THAN THE INTERRUPT ; PERIOD, "$TMBAS" MUST BE SET TO THE DESIRED RATIO OF BASE PERIOD TO ; INTERRUPT PERIOD. $TMBAS = 0 ;DE-SELECT ALTERNATE BASE PERIOD OPTION ; THE FOLLOWING PARAMETERS SPECIFY THE MULTIPLIERS THAT WILm * ; * ; PROGRAM IDENTIFICATION. QUEUE - QUEUE A SOFTWARE TASK; * ; CATALOG NUMBER * ; * ; PURPOSE. SUBROUTINE QUEUE IS RESPONSIBLE FOR PLACING A * ; TASK IN THE SPECIFIED PRIORITY THREAD. A TASK CANNOT BE * ; THREADED VIA QUEUE UNLESS IT IS INACTIVE AND THEnX LINES JSR PC,PRTLNS ;PRINT SOME LINES SUB #100.,BYTCT ;HASNT RUN OUT YET ADD #100.,MAGBP TST BYTCT ;HAS BYTCT RUN DOWN BLE 14$ JSR PC,A100 ;ADD 100. TO LINER UPPER JMP 15$ 14$: JMP START ;GO GET NEXT RECORD EOFF: JSR PC,PRTBLK ;PRINT A BLANK LINE MOV #EOFM,R1 ;PRINT EOF MESSAGE MOV #11.,R5 JSR oIV = 350 ;UNIT 2 ADDRESSES TT2ICS = 160210 TT2IDB = 160212 TT2OIV = 354 TT2OCS = 160214 TT2ODB = 160216 ; TT3IIV = 360 ;UNIT 3 ADDRESSES TT3ICS = 160220 TT3IDB = 160222 TT3OIV = 364 TT3OCS = 160224 TT3ODB = 160226 ; TT4IIV = 370 ;UNIT 4 ADDRESSES TT4ICS = 160230 TT4IDB = 160232 TT4OIV = 374 TT4OCS = 160234 TT4ODB = 1602pL BE LOADED ; INTO THE RESOLUTION COUNTER TABLES FOR DETERMINING THE PERIOD OF EACH ; RESOULTION. THE PERIOD OF A GIVEN RESOLUTION LEVEL DEPENDS ON ALL ; THE PRECEDING LEVELS (WITH LOWER NUMBERS), WHICH ACT AS SUCCESSIVE ; MULTIPLIERS IN COUNTING TO THE GIVEN RESOLUTION LEVEL. ; THUS, FOR "RES4", ITS PERIOD WOULD BE: ; RES4*RES3*RES2*RES1*RES0 --- IN UNITS OF THE BASE PERIOD RES0 = 1 ;1/60 RES1 = 15. ;1/4 RES2 = 2 q THREAD WORD * ; IN THE PROGRAM HEADER IS EMPTY (NOMINAL VALUE OF 1). THE * ; PROGRAM REQUESTING THE QUEUEING CAN SELECT WHETHER QUEUE * ; RETURNS TO IT OR TO THE TASK DISPATCHER (DSPTCH). THE * ; CALLING PROGRAM MAY ALSO TRANSMIT A ONE WORD ARGUMENT TO * ; THE QUEUED PROGRAM. * ; * ; PROGRAM USAGE. THE ASSEMBLER LINKAGE TOrPC,PRINT BIT #002000,@#SWR ;STOP DUMP ON EOF TEST BEQ 1$ HALT 1$: JMP START ;GO GET NEXT RECORD EBBSEE: MOV #MAGBUF,MAGBP ;CONVERT FROM EBCDIC TO ASCII AND PRINT MOV BYTECT,BYTCT MOVB #'0,DIGITP+120. MOVB #'1,DIGITP+121. MOVB #'0,DIGITP+122. MOVB #'0,DIGITP+123. 15$: JSR PC,PRTBLK ;PRINT A BLANK LINE JSR PC,SUPHEX ;NOWs36 ; TT5IIV = 400 ;UNIT 5 ADDRESSES TT5ICS = 160240 TT5IDB = 160242 TT5OIV = 404 TT5OCS = 160244 TT5ODB = 160246 ; TT6IIV = 410 ;UNIT 6 ADDRESSES TT6ICS = 160250 TT6IDB = 160252 TT6OIV = 414 TT6OCS = 160254 TT6ODB = 160256 ; TT7IIV = 420 ;UNIT 7 ADDRESSES TT7ICS = 160260 TT7IDB = 160262 TT7OIV = 424 TT7OCS = 160264 TT7ODB t ;1/2 RES3 = 2 ;1 RES4 = 5 ;5 RES5 = 2 ;10 RES6 = 3 ;30 RES7 = 2 ;60 RES8 = 3 RES9 = 5 RES10 = 100. RES11 = 2 RES12 = 2 RES13 = 2 RES14 = 2 RES15 = 2 ; IN SYSTEMS WHERE THE BASE PERIOD IS GREATER THAN ONE MILLISECOND, ; "MSECR" WILL NECESSARILY HAVE A PERIOD GREATER THAN ONE MILLISECOND. MSECR = u SUBROUTINE * ; QUEUE IS: * ; * ; MOV ITASK,-(SP) PUSH * ; MOV IPRTY,-(SP) ARGUMENTS ; MOV IARG,-(SP) ONTO ; MOV IRTRN,-(SP) STACK ; EMT QUEUE THEN CALL QUEUE * ; TST (SP)+ TEST ERRORv SET UP HEX LINES MOV #100.,R0 ;CONVERT EBCDIC TO ASCII MOV MAGBP,R1 3$: MOVB (R1),R2 ;FETCH NEXT CHAR MOV R2,R3 MOV #EBCTAB,R4 5$: CMPB R3,(R4)+ ;MATCH? BEQ 6$ CMP R4,#EBCEND ;MORE? BLOS 5$ MOV #' ,R4 ;BLANK INSERTED FOR ILLEGAL EBCDIC CHAR BR 7$ 6$: SUB #EBCDIC+1,R4 ;WAS IT REGUALR PART OF TABLE BGE w= 160266 ; ; ; SYMBOLIC TABLE AND BUFFER OFFSETS ; ; ; OFFSETS IN I/O REQUEST LIST ; DEVICE = 2 ;LOGICAL DEVICE NO. TYPE = 3 ;EXIT TYPE EXIT = 4 ;I/O COMPLETE ROUTINE (EXIT 3 ONLY) ERRTSK = 6 ;TASK NO. OF ERROR PROGRAM LEVEL = 7 ;PRIORITY LEVEL OF I/O REQUEST ERROR = 10 ;ERROR CODE WORD SYSTEM = 12 ;BYTE 0 CONTAINS TASK NO. Ax 0 ;NORMALLY 1 MSEC: HERE IS = 16.7 MSECS SECR = 3 ;"RES3" IS THE ONE-SECOND RESOLUTION $NRES = 16. ;USE MAX # OF RESOLUTIONS .IFLE $NRES XXXXXXXX ;$NRES MUST BE FROM 1 TO 16 .ENDC .IFG $NRES-16. XXXXXXXX ;COME ON! MUST BE LESS THAN 17 .ENDC ; THE BASE PERIOD FOR THE TIME-OF-DAY CLOCK, ABORT, AND TIME-SLICE IS ; NORMALLY THE INTERRUPT PERIOD, AS SPECIFIEy CODE * ; BNE XXX BRANCH IF ERROR WAS ENCOUTNERED * ; * ; THE FORTRAN EQUIVALENT CALL IS: * ; * ; CALL QUEUE( ITASK, IPRTY, IARG, IRTRN, IERR) *QUEU ; * ; ITASK IS THE NUMBER OFz8$ ;YES ADD #5+11-40,R4 ;WAS ONE OF SPECIALS AT BEGIN OF TABLE 8$: ADD #40,R4 ;CREATE ASCII CHAR FROM TABLE INDEX 7$: MOVB R4,(R1)+ ;REPLACE EBCDIC WITH NON-PARITY ASCII DEC R0 ;MORE CHARS? HANDLE 100 AT A TIME BGT 3$ ;NEXT CHAR JSR PC,PRTLNS ;PRINT SOME LINES SUB #100.,BYTCT ;HASNT RUN OUT YET ADD #100.,MAGBP TST BYTCT {CTIVE WHEN ;CALLED. BYTE 1 CONTAINS TTY PHYSICAL ;UNIT NO. DATA = 14 ;ADDRESS OF USER BUFFER ; .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM ; ; ; OFFSETS IN DISC WRITE BUFFER AND OUTPUT BUFFERS ; SCFLAG = 2 ;SECTOR FLAG INOUT = 3 ;READ/WRITE FLAG RLSECT = 12 ;RELATIVE SECTOR ADDRESS NWORD = 14 ;|D BY "TICRES". ; IF A MULTIPLIER FOR THIS INTERRUPT IS DESIRED TO PRODUCE A COARSER ; BASE PERIOD, USE THE PARAMETER "$ABMPL" TO SPECIFY THE RATIO DESIRED. TICRES = 60. ;# OF T-O-D CLOCK TICKS PER SECOND $ABMPL = 6 ;CLOCK BASE PERIOD = 1/10 SECOND C1COMD = 177546 ;DEVICE ADDRESS FOR HIGH-SPEED CLOCK C1CBIT = 100 ;BIT TO CONTROL FAST CLOCK INTERRUPT $TMSLC = 1 ;SYSTEM OPTION FOR INCLUDING TIME-SLICING $SWATZ} THE TASK TO BE QUEUED * ; IPRTYIS THE PRIORITY LEVEL AT WHICH THE TASK EXECUTES * ; = 0, QUEUE WILL GET THE ASSIGNED PRIORITY FROM THE * ; TASK TABLE * ; > 0, PRIORITY LEVEL SPECIFIED BY CALLING PROGRAM * ; < 0, ILLEGAL * ; IRTRN IS ZERO IF THE CALLING PROGRAM WANTS CONTROL RETURNED * ; TO IT; ~ ;HAS BYTCT RUN DOWN BLE 14$ JSR PC,A100 ;ADD 100. TO LINER UPPER JMP 15$ 14$: JMP START ;GO GET NEXT RECORD ; ; SUBROUTINE TO PERFORM MAG TAPE COMMAND REQUESTED ; GO: CLR @#MGSTAT ;CLEAR STATUS MOV @#SWR,R4 ;ISOLATE TAPE UNIT NO S01 BIC #177760,R4 ; S01 SWAB R4 ; NO. OF WORDS TO TRANSFER TTRLST = 16 ;1ST WORD OF TTY REQUEST LIST .ENDC ; ; ; OFFSETS IN USER BUFFERS ; CHCNT = 2 ;CHAR COUNT MSGDAT = 4 ;BEGINNING OF DATA ; ; ; OFFSETS IN TIMER MODULES ; TCNTR = 4 ;TIMER COUNTER ; ; .IFDF CHKOUT ;****** DELETE ASECT FOR CHECKOUT ****** .ASECT ; ; ; INTERRUPT VECTORS ; .IFGE NTTYS-1 ;IS NO. TT = 20. ;NUMBER OF ENTRIES IN SCHEDULER "WAIT" TABLE $TWATZ = 20. ;WORDS IN TIMER'S "WAIT" TABLE .PAGE ; ; NDISCS = 0 ; DISC OPTION, 0=NONE ; ACTSIZ = 20. ; MAXIMUM NO. OF ENTRIES IN AUTH. CODE .IFL 20.-ACTSIZ XXXXXXXX ; ERROR-ALLOCATE MORE LOCATIONS XXXXXXXX ; FOR AUTHORIZATION CODES .ENDC ; .IFNZ NDISCS DRESDI = 1 ONE IF THE DISPATCHER SHOULD EXECUTE THE * ; HIGHEST PRIORITY TASK. * ; IARG IS A WORD THAT WILL BE TRANSMITTED TO THE QUEUED TASK * ; IERR IS AN ERROR INDICATOR * ; -1 = TASK QUEUED BUT HAD BEEN ABORTED *QUEU ; 0 = QUEUE SUCCESSFUL * ; 1 = ILLEGAL TASK THREAD WORD (NOT 1) *QUEU ; S01 BIS R4,R5 ; S01 MOV R5,@#MAGCMD ;PERFORM OPERATION REQUESTED S01 BIS #1,@#MAGCMD ; SET GO BIT MOV R0,-(SP) ;SAVE R0 MOV #100,R0 SOB R0,. ;LOOP UNTIL CONTROLLER SETTLES MOV (SP)+,R0 ;RESTORE R0 10$: BIT #CURDY,MTC ; UNIT READY ? BEQ 10$ YS GE 1? . = TT0IIV ;YES, SETUP UNIT 0 INPUT VECTOR .WORD KBDINT,200 . = TT0OIV ;SETUP UNIT 0 OUTPUT VECTOR .WORD PRTINT,200 .ENDC .IFGE NTTYS-2 ;IS NO. TTYS GE 2? . = TT1IIV ;YES, SETUP UNIT 1 INPUT VECTOR .WORD KBDINT,201 . = TT1OIV ;SETUP UNIT 1 OUTPUT VECTOR .WORD PRTINT,201 .ENDC .IFGE NTTYS-3 ;IS NO. TTYS GE 3? ; DISC RESIDENT DIRECTORY OPTION .IFL 3-NDISCS XXXXXXXX ; PRESENTLY CODED FOR MAX. OF 3 DISCS .ENDC ; NDPRT1 = 5 ; NO. OF PRIORITY LEVELS IN DISC 1 QUEUES .IFL NDPRT1-3 XXXXXXXX ; MUST BE AT LEAST THREE .ENDC ; .IFG NDISCS-1 NDPRT2 = 7 ; NO. OF PRIORITY LEVELS IN DISC 2 QUEUES .IFL NDPRT2-3 XXXXXXXX ; MUST BE AT LEA 2 = TASK STATUS NOT 0 OR 7(QUIESCENT OR ABORTED *QUEU ; 3 = TASK WAS ABORTED DURING LAST EXECUTION PERIOD, AND * ; I/O IS STILL IN PROGRESS (TASK NOT QUEUED) * ; 4 = TASK DISABLED * ; 5 = ILLEGAL TASK NUMBER * ; 6 = NOT QUEUED SINCE SPECIFIED PRIORITY LEVEL WILL NOT *QUEU ; SUPPORT OVERLAY TASKS ; NO - WAIT RTS PC ; ; BLANK OUT HEX BUFFERS SUBROUTINE ; BLKHX: MOV #112.,R2 1$: MOVB #40,HEXZ+20.-1(R2) MOVB #40,HEXD+20.-1(R2) SOB R2,1$ RTS PC ; ; SUBROUTINE TO SKIP TO THE TOP OF THE NEXT PAGE ON THE LP ; ONECHR: .BYTE 0 .BYTE 0 TOP: CLR @#LPS ; CLEAR LP MOV #FF,R0 ; WRITE TOP JSR PC,PRINTC ; OF FORM RTS PC . = TT2IIV ;YES, SETUP UNIT 2 INPUT VECTOR .WORD KBDINT,202 . = TT2OIV ;SETUP UNIT 2 OUTPUT VECTOR .WORD PRTINT,202 .ENDC .IFGE NTTYS-4 ;IS NO. TTYS GE 4? . = TT3IIV ;YES, SETUP UNIT 3 INPUT VECTOR .WORD KBDINT,203 . = TT3OIV ;SETUP UNIT 3 OUTPUT VECTOR .WORD PRTINT,203 .ENDC .IFGE NTTYS-5 ;IS NO. TTYS GE 5? . = ST THREE .ENDC .ENDC ; .IFG NDISCS-2 NDPRT3 = 3 ; NO. OF PRIORITY LEVELS IN DISC 3 QUEUES .IFL NDPRT3-3 XXXXXXXX ; MUST BE AT LEAST THREE .ENDC .ENDC NCFILE = 40. ; NO. OF CORE RESIDENT FILE ID'S ERRPRT = 1 ; PRINT-OUT DISC ERROR MESSAGES OPTION .ENDC .PAGE ; ; TTYIO SYSGEN PARAMETERS ; NTTYS = 2 ;N *QUEU ; 7 = NOT QUEUED SINCE RPOM'S QPART TABLE IS FULL *QUEU ; * ; IF THE PRIORITY LEVEL SPECIFIED IS ILLEGAL, THEN THE PROGRAM * ; IS QUEUED AT THE LOWEST PRIORITY LEVEL. * ; * ; REGISTERS R1 - R4 ARE USED BY QUEUE AND ARE NOT SAVED UNLESS * ; THE RGSAVE EQUATE PARAMETER IS SET TO 1. ; ; BLANK OUT SCRATCH LINE SUBROUTINE ; BLKSL: MOV #132.,R2 1$: MOVB #40,SCRBUF-1(R2) SOB R2,1$ RTS PC ; ; SUBROUTINE TO PRINT A BLANK LINE ; PRTBLK: JSR PC,BLKSL ;SET SCRATCH BUFFER TO BLANKS MOV #SCRBUF,R1 ;NOW PRINT IT MOV #LL,R5 ; JSR PC,PRINT RTS PC ; ; SUBROUTINE TO PRINT A LINE OF 132 CHARS ON THE LINE PRINTER TT4IIV ;YES, SETUP UNIT 4 INPUT VECTOR .WORD KBDINT,204 . = TT4OIV ;SETUP UNIT 4 OUTPUT VECTOR .WORD PRTINT,204 .ENDC .IFGE NTTYS-6 ;IS NO. TTYS GE 6? . = TT5IIV ;YES, SETUP UNIT 5 INPUT VECTOR .WORD KBDINT,205 . = TT5OIV ;SETUP UNIT 5 OUTPUT VECTOR .WORD PRTINT,205 .ENDC .IFGE NTTYS-7 ;IS NO. TTYS GE 7? . = TT6IIV O. OF TTY UNITS ;IN SYSTEM SYSTTY = 0 ;LOGICAL UNIT NO. OF SYSTEM ;TTY DEVICE MSGBUF = 0 ;MESSAGE BUFFERING OPTION: IF 1, ;DISC MESSAGE BUFFERING VERSION IS ;ASSEMBLED. IF 0, CORE VERSION IS ;ASSEMBLED. DISCUN = 1 ;LOGICAL UNIT NO. OF DISC TO BE USED * ; ; NOTE: IARG AND/OR IPRTY MUST BE OMITTED IF THE CORRESPONDING * ; FUNCTION IS OMITTED AT SYSGEN TIME. REFER TO DPRTY AND * ; ARG EQUATE PARAMETERS BELOW. * ; * ; * ; PROGRAMMER 55 * ; DATE 07.20.71 ; PRINT: MOV #0,@#LPCMD ; CLR L/P 10$: TST @#LPB ; LP READY ? BPL 10$ ; NO - WAIT MOV #132.,R3 ;BLANK OUT PRINT BUFFER IN EVEN PARITY 1$: MOVB #240,PRTBUF-1(R3) SOB R3,1$ MOV #PRTBUF,R0 ;PRINT BUFFER ADDRESS MOV #132.,CHARCT ;CHAR COUNT 8$: MOVB (R1)+,R2 ;NEXT ASCII CHAR CMP R2,#40 ;<40 TEST BGE 2$ ;YES, SET UP UNIT 6 INPUT VECTOR .WORD KBDINT,206 . = TT6OIV ;SETUP UNIT 6 OUTPUT VECTOR .WORD PRTINT,206 .ENDC .IFGE NTTYS-8. ;IS NO. TTYS GE 8? . = TT7IIV ;YES, SETUP UNIT 7 INPUT VECTOR .WORD KBDINT,207 . = TT7OIV ;SETUP UNIT 7 OUTPUT VECTOR .WORD PRTINT,207 .ENDC .IFG NTTYS-8. ;IS NO. TTYS GT 8? XXXXXX ;CREA ;FOR MESSAGE BUFFERING DBUFSZ = 1 ;NO. OF 64 WORD DISC SECTORS ALLOCATED ;FOR BUFFERING OF ONE MESSAGE ON DISC FILESZ = 20*DBUFSZ ;NO. OF SECTORS PER FILE NTRYS = 3 ;NO. OF TRYS TO OUTPUT A CHARACTER ;TO TTY TTOTIM = 15. ;MILLISECOND COUNT FOR TTY ;OUTPUT TIMERS TTITIM = 15. ;SECOND COUNT FOR TTY * ; REVISION * ; * ;*********************************************************************** ; .PAGE .DEF QUEUE .IFNZ OVRLAY ; QUEU .REF QOVLAY ; QUEU .ENDC ;NO 4$: MOVB #240,R0 ; CHANGE JSR PC,PRINTC ; TO SP BR 3$ 2$: CMP R2,#140 ;>137 TEST BGE 4$ ;YES CLR -(SP) ;GET EVEN PARITY FOR ASCII CHAR IN R2 MOV #7,R4 MOV R2,R3 5$: ASR R3 ADC (SP) DEC R4 BGT 5$ ASL R2 ASR (SP)+ RORB R2 MOVB R2,R0 ; PUT TO TE ASSY ERROR, NTTYS GT 8!! .ENDC .ENDC ;****** EELETE ASECT FOR CHECKOUT ****** .CSECT ; ; ; TABLE OF CONTROL STATUS REGISTER ADDRESSES ORDERED BY UNIT NO. ; TTICSR: .WORD TT0ICS,TT1ICS ;INPUT CSR'S .WORD TT2ICS,TT3ICS .WORD TT4ICS,TT5ICS .WORD TT6ICS,TT7ICS ; .=TTICSR+NTTYS+NTTYS ;DELETE UNUSED WORDS ; TTOCSR: .WORD TT0OCS,TT1OCS ;OUTPUT CSR'S .WORD TT2OCS,TT3OCS .WORD TTINPUT/OPERATOR ;RESPONSE TIMERS TTWTIM = 240. ;SECOND COUNT FOR WAIT TIMER NWUCH = 5 ;NO. OF CHARS TO BE OUTPUT FOR ;WARMUP OF A TTY UNIT EOMCH = 33 ;ALTERNATE EOM CHAR (ALT KEY) EOMOPT = 0 ;EOM CHAR OPTION WHERE ; 1 = EOM IS FOLLOWED BY CR AND LF ; 0 = NOT FOLLOWED BY CR AND LF EOMP QUEU ; KSAVE = RGSAVE+RGSAVE+RGSAVE+RGSAVE SAVE = KSAVE+KSAVE NARG =6+ARG+ARG+DPRTY+DPRTY+SAVE ; NO. ARGS TIMES TWO (INCL. IERR IERR = NARG ;THESE EQUATES IRTRN = 4+SAVE ; ARE USED AS OFFSETS IARG = IRTRN+ARG+ARG ; FOR THE ARGUMENTS AS IPRTY = IARG+DPRTY+DPRTY ; THEY APPEAR IN THE STACK ITASK = IPRTY+2 ; ; ; ; EQUATES FOR PROGRAM HEADER ; ; THREAD = 0 JSR PC,PRINTC ; PRINTER 3$: DEC R5 ;DECREMENT BYTE CT BLE 6$ DEC CHARCT ;DECREMENT CHAR CT BLE 6$ JMP 8$ ;NEXT CHAR 6$: JSR PC,PRIT ;PRINT IT RTS PC ;RETURN PRIT: MOVB #LF,R0 JSR PC,PRINTC RTS PC ; ; PRINT A CHAR ; PRINTC: TST @#LPB ; READY ? BPL PRINTC ; NO - 4OCS,TT5OCS .WORD TT6OCS,TT7OCS .=TTOCSR+NTTYS+NTTYS ;DELETE UNUSED WORDS ; ; ; TABLE OF DATA BUFFER REGISTER ADDRESSES ORDERED BY UNIT NO. ; TTIDBR: .WORD TT0IDB,TT1IDB ;INPUT DBR'S .WORD TT2IDB,TT3IDB .WORD TT4IDB,TT5IDB .WORD TT6IDB,TT7IDB .=TTIDBR+NTTYS+NTTYS ; TTODBR: .WORD TT0ODB,TT1ODB ;OUTPUT DBR'S .WORD TT2ODB,TT3ODB .WORD TT4ODB,TT5ODB .WORD TT6ODB,TT7ODB .=TTODBR+NTTYS; PSTP ; PSTP ; THE SYSGEN PARAMETER '$PST CONTROLS THE EXECUTION PATH*PSTP ; DURING A TASK ERROR. PSTP ; = -1 ROS + USER ROUTINES PSTP ; = 0 ROS PSTP ; = +1 USER . ;THREAD WORD ENTRY = 2. ;TASK ENTRY POINT INITPT = 4. ;TASK INITIALIZATION ENTRY MAXT = 6. ;MAXIMUM EXECUTION TIME SIZE =8. ; NO. WORDS FOR STACK IN HEADER (BYTE) QUEU HPRIOR =9. ; TASK PRIORITY (BYTE) QUEU CTIMER = 10. ;CURRENT TIMER VALUE TARG = CTIMER+ARG+ARG ;ARGUMENT (OPTIONAL) CPUST = TARG+2 ;CPU STA TSTB @#LPS ; BPL PRINTC ; MOVB R0,@#LPB ; YES - PRINT IT 20$: TST @#LPB ; READY ? BPL 20$ ; NO - RTS PC ; ; ; ; SET UP HEX LINES SUBROUTINE ; SUPHEX: JSR PC,BLKHX ;BLANK OUT HEX ZONES BUFFERS MOV MAGBP,R2 ;NOW DO HEX LINES MOV BYTCT,R3 MOV #20.,R4 MO+NTTYS .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM ; ; ; TABLE OF FILE ID'S FOR MESSAGE BUFFERING ; FILEID: .WORD FIDN0,FIDP0 .WORD FIDN1,FIDP1 .WORD FIDN2,FIDP2 .WORD FIDN3,FIDP3 .WORD FIDN4,FIDP4 .WORD FIDN5,FIDP5 .WORD FIDN6,FIDP6 .WORD FIDN7,FIDP7 . = FILEID+NTTYS+NTTYS+NTTYS+NTTYS ;DELETE UNUSED WORDS ; ; ; TABLE OF OUTPUT BUFFER ADDRESSES ORDERED BY UNIT NO. ; T PSTP ; PSTP $PST = 0 ; PSTP ; PSTP .TITLE PSTRAP ; PSTP ;***********************************************************************PSTP ; P S T R A P *PSTP ; TUS REGISTER (BYTE) TASKNO = CPUST+1 ;TASK NUMBER (BYTE) TSTACK = TASKNO+1 ;SAVED STACK POINTER REGSV = TSTACK+2 ;REGISTER SAVE AREA PS = 177776 ;CPU STATUS REGISTER ADDRESS ; R0=%0 ;GENERAL R1=%1 ; QUEU R2=%2 ; QUEU R3=%3 ; REGISTER R4=%4 V #100.,MAXCCT ;MAX CHAR CT PER LINE IS 100 13$: MOVB (R2),R5 ;HANDLE HEX ZONES ASHC #-4,R5 BIC #177760,R5 CMP #12,R5 BGT 8$ ADD #67,R5 ;A-F, THEREFORE ADD 67 TO IT BR 9$ 8$: ADD #60,R5 ;0-9, THEREFORE ADD 60 TO IT 9$: MOVB R5,HEXZ(R4) MOVB (R2)+,R5 ;HANDLE DIGIT ZONES BIC #177760,R5 CMP #12,R5 BGT 10$ TOBUF: .WORD TTOBF0,TTOBF1 .WORD TTOBF2,TTOBF3 .WORD TTOBF4,TTOBF5 .WORD TTOBF6,TTOBF7 . = TTOBUF+NTTYS+NTTYS ; ; ; TABLE OF DISC READ I/O LIST ADDRESSES ORDERED BY UNIT NO. ; DRLIST: .WORD DRLST0,DRLST1 .WORD DRLST2,DRLST3 .WORD DRLST4,DRLST5 .WORD DRLST6,DRLST7 . = DRLIST+NTTYS+NTTYS ; ; ; DISC WRITE I/O LIST ; DWLIST: .WORD 1 ;THREAD WORD .BYTE DISCUN *PSTP ; PROGRAM IDENTIFICATION: PSTRAP *PSTP ; *PSTP ; PURPOSE: PROVIDES HANDLING OF THE UNUSED PROCESSOR TRAPS: *PSTP ; BUS ERROR TRAP ( 4) *PSTP ; RESERVED INSTRUCTION TRAP (10) *PSTP ; TRACE TRAP ; QUEU R5=%5 ; QUEU SP=%6 ; EQUATES PC=%7 ; QUEU ; ; ; NOW, LET'S GET ON WITH THE PROGRAM ; ; QUEUE = . .IFNZ RGSAVE MOV R1,-(SP) ;SAVE MOV R2,-(SP) ; REGISTERS MOV R3,-(SP) ; FOR THE MOV ADD #67,R5 ;A-F BR 11$ 10$: ADD #60,R5 ;0-9 11$: MOVB R5,HEXD(R4) INC R4 DEC R3 ;DEC BYTE COUNT BLE 12$ DEC MAXCCT ;DEC MAX CHAR CT PER LINE BLE 12$ BR 13$ 12$: RTS PC ; ; SUBROUTINE TO PRINT A BLANK LINE, DATA LINE, TWO HEX LINES, ; AND A LINER UPPER LINE. ; PRTLNS: JSR PC,BLKSL ;BLANK OUT S ;LOGICAL DEVICE NO FOR DISC .BYTE 3 ;EXIT TYPE -- 3 .WORD TTYDW1 ;ADDRESS OF I/O COMPLETE ROUTINE .BYTE 0 ;NO ERROR TASK TO BE QUEUED ON ERROR .BYTE NDPRT1 ;PRIORITY OF REQUEST .WORD 0 ;ERROR CODE WORD .WORD 0 ;"SYSTEM" WORD .WORD DSCBUF ;DATA BUFFER ADDRESS ; ; ; DISC WRITE BUFFER ; DSCBUF: .WORD 0 ;FILE ID .BY(20) *PSTP ; *PSTP ; USAGE: WHEN ONE OF THE UNUSED TRAPS IS ACTIVATED, CONTROL *PSTP ; IS PASSED TO THE ENTRY POINT 'PSTRAP' WHERE THE ERROR *PSTP ; IS PROCESSED. THE TRANSFER IS ACCOMPOLISHED BY *PSTP ; PLACING 'PSTRAP'S' ADDRESS IN THE TRAP AT SYSTEM *PSTP ; INITALIZATION VIA THE ENTRY POINT 'PSTIPL'. THE *PSTP ; R4,-(SP) ; CALLER .ENDC MOVB @#PS,R3 ; SAVE PS FOR LATER QUEU CLR -(SP) ;/ = NO ERRORS; 3 = Q'ED BUT ABORTED CLR R4 ; CLEAR REG FOR BYTE LOAD QUEU BISB ITASK(SP),R4 ; GET TASK NUMBER OFF STACK QUEU CLR IERR(SP) ; CLEAR ERROR STATUS FOR RETURN QUEU TST R4 ; RESET STATUS BITS QUEU CRATCH BUFFER BIT #400,@#SWR ;EBCDIC OR ASCII CHARS BEQ 10$ MOV #12.,R2 11$: MOVB ECHA-1(R2),SCRBUF-1(R2) SOB R2,11$ BR 12$ 10$: MOV #11.,R2 13$: MOVB ACHA-1(R2),SCRBUF-1(R2) SOB R2,13$ 12$: MOV MAGBP,R2 ;SET UP POINTERS AND COUNTERS MOV BYTCT,R3 MOV #SCRBUF+20.,R4 MOV #100.,MAXCCT ;MAX CHAR CT PER LINE IS 100 7$: MOVB (R2)TE 0 ;SECTOR FLAG .BYTE 1 ;READ/WRITE FLAG .WORD 0 ;RESERVED FOR DISCIO USE .WORD 0 ;RESERVED FOR DISCIO USE .WORD 0 ;RESERVED FOR DISCIO USE .WORD 0 ;RELATIVE SECTOR ADDRESS .WORD DNWRDS ;NO. OF WORDS TO TRANSFER . = .+OBUFSZ ;ALLOCATE SPACE FOR LIST & DATA ; ; ; DISC READ I/O LISTS ORDERED BY UNIT NO. ; DRLST0: .WO LINKAGE IS: *PSTP ; *PSTP ; PSTIPL - JSR PC,PSTIPL *PSTP ; *PSTP ; PSTRAP - TRAP VIA LOCATION 4, 10, OR 20. *PSTP ; *PSTP ; BEQ QUEE50 ; BRANCH IF TASK #=0. ILLEGAL QUEU CMPB R4,TASKS ; IS TASK#> LARGEST LEGAL TASK NUMBER QUEU BHI QUEE50 ; BRANCH IF YES. ILLEGAL. QUEU ; QUE000 = . MOVB #340,@#PS ; LOCK OUT ALL INTERRUPTS QUEU TSTB TSTAT(R4) ;NOW, MAKE SURE THE TASK IS INACTIVE BEQ QUEA00 ;BRANCH IF IT IS. CMPB TSTAT(R4),#7 ; QUIESCENT. WAS IT+,(R4)+ ;MOVE CHARS TO SCRATCH BUFFER DEC R3 ;DEC BYTE COUNT BLE 6$ DEC MAXCCT ;DEC MAX CHAR CT PER LINE BLE 6$ BR 7$ ;LOOP TIL DONE 6$: MOV #SCRBUF,R1 ;PRINT THE ASCII LINE MOV #LL,R5 ; JSR PC,PRINT MOV #HEXZ,R1 ;PRINT HEX ZONES LINE MOV #LL,R5 ; JSR PC,PRINT MOV #HEXD,R1 RD 1 ;THREAD WORD .BYTE DISCUN ;LOGICAL DEVICE NO. FOR DISC .BYTE 3 ;EXIT TYPE -- 3 .WORD TTYDR1 ;ADDRESS OF I/O COMPLETE ROUTINE .BYTE 0 ;NO ERROR TASK TO BE QUEUED ON ERROR .BYTE NDPRT1-1 ;PRIORITY OF REQUEST (1 GT WRITE REQ'S) .WORD 0 ;ERROR CODE WORD .WORD 0 ;"SYSTEM" WORD .WORD TTOBF0 ;DATA BUFFER ADDRESS DRL PSTP ; THE SYSGEN PARAMETER '$PST' IS USED TO CONTROL ROS HANDLING OF PSTP ; A PROCESSOR TRAP VIA EITHER AN ERROR TRAP(4 & 10) OR AN UNUSED PSTP ; TRAP(20). PSTP ; IT IS ONLY EVALUATED IF THE TRAP OCCURES FROM A TASK. IN THAT PSTP ; CASE, IF $PST=1, A JSR PC,UPST WILL BE EXECUTED. NO OTHER PSTP ; ACTION WILL BE TAKEN. IF $DST=0, THE STANDARD ROS PROCEEDURE PSTP ; WILL BE FO ABORTED. IF SO, QUEU BNE QUEE20 ; QUEU TSTB IOSTAT(R4) ;WE'LL GIVE THE CALLER A REPRIEVE IF BNE QUEE30 ; IF THE TASK'S I/O ISN'T INPROGRESS QUEU MOV #-1,IERR(SP) ; HORRAY - HE CAN STILL QUEUE IT. QUEU ; ; ; NOW, LET'S SEE IF WE CAN QUEUE THE TASK ; ; QUEA00=. ASL R4 ; MULT. R4 BY 2 TO MAKE INTO WRD INDEX MOV HEADER(R4),R2 ;PRINT HEX DIGIT LINE MOV #LL,R5 ; JSR PC,PRINT MOV #DIGITP,R1 ;PRINT CHAR LINER UPPER MOV #124.,R5 JSR PC,PRINT RTS PC ;RETURN ; ; SUBROUTINE TO ADD 100. TO LINER UPPER ; A100: JSR R5,ABSCNV ;ADD 100 TO LINER UPPER .WORD DIGITP+120. .WORD WORK1 .WORD 4 ADD #100.,WORK1 JSR R5,BASCNV .WORD WOST1: .WORD 1 .BYTE DISCUN,3 .WORD TTYDR1 .BYTE 0,NDPRT1-1 .WORD 0,0,TTOBF1 DRLST2: .WORD 1 .BYTE DISCUN,3 .WORD TTYDR1 .BYTE 0,NDPRT1-1 .WORD 0,0,TTOBF2 DRLST3: .WORD 1 .BYTE DISCUN,3 .WORD TTYDR1 .BYTE 0,NDPRT1-1 .WORD 0,0,TTOBF3 DRLST4: .WORD 1 .BYTE DISCUN,3 .WORD TTYDR1 .BYTE 0,NDPRT1-1 .WORD 0,0,TTOBF4 DRLST5: .LLOWED. IF $PST=-1, THE STANDARD ROS PROCEEDURE WILL PSTP ; BE FOLLOWED AFTER WHICH, A JSR PC,UPST WILL BE EXECUTED. PSTP ; THE PS WILL BE AT THE LEVEL PRIOR TO THE TRAP WHEN THE JSR PSTP ; IS EXECUTED. PSTP ; *PSTP ; PROGRAMMER: 53 *PSTP ; VERSION: 0 ;FIRST, GET PROGRAM HEADER ADDRESS ASR R4 ; DIV. R4 BY 2 TO RESTORE INTO BYTE INDX CMP (R2),#1 ; IS THREAD WORD 1(QUEUABLE) QUEU BNE QUEE10 ; QUEU QUEA10 =. ; QUEU MOVB #1,TSTAT(R4) ; SET STATUS TO QUEUING IN PROGRESS. QUEU MOVB R3,@#PS ; ALLOW INTERRUPTS QUEU .IRK1 .WORD DIGITP+120. .WORD 4 RTS PC .EVEN HDMES: .ASCII / RECORD / RCT: .BYTE 0,0,0,0 .ASCII /, BYTE COUNT / BCT: .BYTE 0,0,0,0 .ASCII /, DUMPED IN / DTY: .BYTE 0,0,0,0,0,0 RER: .ASCII / / .EVEN EBC: .ASCII /EBCDIC/ ASC: .ASCII /ASCII / .EVEN ACHA: .ASCII /ASCII CHARS/ .EVEN ECHA: .ASCII /EBCDIC CHARS/ .EVEN TRE: .ASCII /, TAPE WORD 1 .BYTE DISCUN,3 .WORD TTYDR1 .BYTE 0,NDPRT1-1 .WORD 0,0,TTOBF5 DRLST6: .WORD 1 .BYTE DISCUN,3 .WORD TTYDR1 .BYTE 0,NDPRT1-1 .WORD 0,0,TTOBF6 DRLST7: .WORD 1 .BYTE DISCUN,3 .WORD TTYDR1 .BYTE 0,NDPRT1-1 .WORD 0,0,TTOBF7 DRLSSZ = DRLST1-DRLST0 ;DELETE UNUSED IO LISTS . = DRLSSZ*NTTYS+DRLST0 ; ; ; TTY OUTPUT BUFFERS ORDERED BY UNI *PSTP ; CATALOGUE NUMBER: *PSTP ; *PSTP ;***********************************************************************PSTP .PAGE PSTP .DEF PSTIPL ; PSTP ; PSTP PSTIPL =. FNZ DPRTY ;DON'T ASSEMBLE THIS PART IF DPRTY=0 * MOVB IPRTY(SP),R1 ; GET DYNAMIC PRIORITY (ALWAYS POSITIVE)QUEU BGT QUEB10 ;USE THE PRIORITY IF .GT. 0 * BEQ QUEB00 ;BRANCH IF WE HAVE TO GET PRIORITY * BR QUEB20 ;FROM TASK TABLE. OTHERWISE, USE * .ENDC ;LOWEST PRIORITY * ; QUEB00 = . MOVB TPRTY(R4),R1 ;GET PRIORITY FRREAD ERROR/ NTRE: .ASCII / / .EVEN DIGITP: .ASCII / .1 .5 .10 .15 .20 .25 .30/ .ASCII / .35 .40 .45 .50 .55 .60 .65 .70 .75 .80 / .ASCII /.85 .90 .95 .0100/ .EVEN HEXZ: .ASCII /HEX ZONES / .=.+112. .EVEN HEXD: .ASCII /HEX DIGIT / .=.+112. .EVEN EOFM: .ASCII /END-OF-FILE/ .EVEN SCRBUF: .=.+132. .EVEN PRT NO. ; TTOBF0: .WORD 0 ;FILE ID .BYTE 0 ;SECTOR FLAG .BYTE 0 ;READ/WRITE FLAG .WORD 0 ;RESERVED FOR DISCIO USE .WORD 0 ;RESERVED FOR DISCIO USE .WORD 0 ;RESERVED FOR DISCIO USE .WORD 0 ;RELATIVE SECTOR ADDRESS .WORD DNWRDS ;NO. OF WORDS TO TRANSFER . = .+OBUFSZ ;ALLOCATE SPACE FOR LIST AND DATA TTOB ; INITLAZATION ENTRY POINT PSTP MOV #PSTRAP,R0 ; GET ADDRESS OF TRAP HANDLER. PSTP MOV #4,R2 ; GET ADDRESS OF FIRST TRAP PSTP MOV R0,(R2)+ ; SET UP BUS ERROR & TIME OUT TRAP PSTP MOV #341,(R2)+ ; SET DS FOR TRAP - CARRY BIT SET PSTP MOV R0,(R2)+ ; SET UP RESERVED INSTRUCTION TRAP PSTP MOV #342,(R2)+ ; SET PS FOR TRAP - OVERFLOW BIT SOM TASK TABLE BLE QUEB20 ;BRANCH IF ILLEGAL (.LE. 0) ; QUEB10 = . CMPB R1,#NPRIOR ; IS PRIORITY GT HIGEST LEGAL LEVEL QUEU BLE QUEB30 ;BRANCH IF NO (PRIORITY IS VALID) ; QUEB20 = . MOVB #NPRIOR,R1 ; ILLEGAL LEVEL, USE LOWEST LEVEL QUEU ; QUEB30 = . .IFNZ OVRLAY CMPB R4,#OVTMIN ; OVERLAY OR CORE TASK? QUEU BHIS QUEH00 ; TBUF = . .=.+132. .EVEN MAGBUF: .BLKB 20000. ; ***** SPECIAL BUFFER XFER .END TAPDUM F1: .WORD 0,0,0,0,0,0,DNWRDS . = .+OBUFSZ TTOBF2: .WORD 0,0,0,0,0,0,DNWRDS . = .+OBUFSZ TTOBF3: .WORD 0,0,0,0,0,0,DNWRDS . = .+OBUFSZ TTOBF4: .WORD 0,0,0,0,0,0,DNWRDS . = .+OBUFSZ TTOBF5: .WORD 0,0,0,0,0,0,DNWRDS . = .+OBUFSZ TTOBF6: .WORD 0,0,0,0,0,0,DNWRDS . = .+OBUFSZ TTOBF7: .WORD 0,0,0,0,0,0,DNWRDS . = .+OBUFSZ TTOBSZ = TTOBF1-TTOBF0 ;DELETE UNUSED BUFFERS . = TTOBSZ*NET PSTP CMP (R2)+,(R2)+ ; SKIP OVER DEBUG TRAP PSTP MOV R0,(R2)+ ; SET UP IOT TRAP PSTP MOV #344,(R2)+ ; SET PS FOR TRAP - ZERO BIT SET PSTP CLR $PSTCT ; CLEAR THE COUNTER USED FOR # OF TRAPS PSTP MOV #1,R0 ; PUT A 1 IN REG FOR RESETTING I/O PSTP MOV R0,PSMES1 ; THREAD WORDS. PSTP MOV R0,PSMES2 GO DO OVERLAY STUFF QUEU .ENDC MOVB R1,HPRIOR(R2) ;SAVE PRIORITY IN PROGRAM HEADER ; ; ; THE TIME HAS COME TO PLACE THE TASK IN THE SPECIFIED THREAD. ; THE INDIVIDUAL PRIORITY THREADS ARE MAINTAINED IN 'FIRST' ; AND 'LAST'. ; ; MOVB #340,@#PS ;THEN INHIBIT INTERRUPTS DEC (R2) ;INSERT TASK HEADER ADDRESS IN QUEUE BNE QUEE10 ; ERROR. TASK NO LONGER QUEUABLE. QUEU .WORD 0 ; STACK POINTER .=.+RES+RES ; TASK STACK AREA ; EN11 =. ; CLR CN11 ; CLR R0 ; EN11A: INC R0 ; INC CN11 ; CLR R1 ; EMT SUSPND ; BR EN11A ; CN11: .WORD 0 ; .PAGE .CSECT TASK12 ; HEAD12 =. ; TTYS+TTOBF0 .IFG NTTYS-8. ;IF NTTYS .GT. 8? XXXXXX ;CREATE ASSY ERROR, NTTYS GT 8!! .ENDC .ENDC ; ; ; ERROR MODULE USED TO TYPE OUT ERROR CODE ; ERRMOD: .WORD 1 ; THREAD WORD .WORD 0 ; ERROR NO. .WORD 0,0,0,0 ; ARG 1-4 ; ; ; TABLE OF INPUT TIMER MODULE ADDRESSES ORDERED BY UNIT NO. ; ITIMER: .WORD ITIME0,ITIME1 .WORD ITIME2,ITIME3 .WORD IT ; PSTP RTS PC ; RETURN TO CALLER PSTP .PAGE PSTP .DEF $PSTCT,$OLDPS,$PCSAV,$TCODE ; PSTP .REF ACTIVE,DSPTCH ; PSTP .IFLE $PST ; INCLUDE IFF ROS TRAP HANDLER USED. PSTP .REF $CTASK,LERTYP,ABORT ; ASL R1 ; MAKE R1 INTO WORD INDEX. DON'T NEEDLAT MOV R2,@LAST(R1) MOV R2,LAST(R1) ; QUEC10 = . MOVB #2,TSTAT(R4) ; SET STATUS TO QUEUED CLRB IOSTAT(R4) ;CLEAR I/O STATUS CLR TSTACK(R2) ; CLEAR TASK STACK POINT (USED BY DSPT QUEU ; AS A FLAG). QUEU ; CLRB CPUST(R2) QUEU ; CLR .WORD 1 ; THREAD WORD .WORD EN12 ; ENTRY POINT .WORD 0 ; INITIAL ENTRY POUNT .WORD 0 ; MAX TIME .BYTE RES ; ST SIZE .BYTE 8. ; PRIORTY .WORD 0 ; CURRENT TIMER .IFNZ ARG ; .WORD 0 ; PASSED ARGUMENT .ENDC .BYTE 0 ; CPU STATUS .BYTE 12. IME4,ITIME5 .WORD ITIME6,ITIME7 . = ITIMER+NTTYS+NTTYS ; ; ; TABLE OF OUTPUT TIMER MODULE ADDRESSES ORDERED BY UNIT NO. ; OTIMER: .WORD OTIME0,OTIME1 .WORD OTIME2,OTIME3 .WORD OTIME4,OTIME5 .WORD OTIME6,OTIME7 . = OTIMER+NTTYS+NTTYS ; ; ; TABLE OF WAIT TIMER MODULE ADDRESSES ORDERED BY UNIT NO. ; WTIMER: .WORD WTIME0,WTIME1 .WORD WTIME2,WTIME3 .WORD WTIME4,WTIME5 .WORD WTIME6,WTPSTP .ENDC PSTP .IFNZ $PST ; INCLUDE IFF USER TRAP HANDLER USED. PSTP .REF UPST ; REFERENCE THE ENTRY POINT PSTP .ENDC PSTP PSTRAP =. ; TRAP ENTRY POINT PSTP MOV @#PS,$TCODE ; GET NEW PS PSTP BIC #177740,$TCODE ; LE CTIMER(R2) QUEU ; MAY NEED CPUST AND CTIMER LATER. QUEU .IFNZ ARG ;DON'T ASSEMBLE IF ARGUMENT ISN'T USED* MOV IARG(SP),TARG(R2) ;MOVE ARGUMENT TO PROGRAM HEADER * .ENDC ; ; ; ALL IS NOW DONE - RESTORE THE REGISTERS, THEN SEE WHO ; GETS CPU CONTROL (TEST IRTRN) ; ; QUEC15 =. ; HERE TO GO BACK QUEU ; TASK NUMBER .WORD 0 ; STACK POINTER .=.+RES+RES ; TASK STACK AREA ; EN12 =. ; CLR CN12 ; CLR R1 ; EN12A: INC R1 ; INC CN12 ; CLR R0 ; MOV #11.,-(SP) ; MOV #1,-(SP) ; EMT UNSPND ; TST (SP)+ ; BR EN12IME7 . =WTIMER+NTTYS+NTTYS ; ; ; INPUT TIMER MODULES (OPERATOR RESPONSE TIMER) ; ITIME0: .WORD 1 ;THREAD WORD .BYTE 0 ;TASK NO. (N/A) .BYTE SECR!TJOPTN!TFOPTN ;OPTION FLAGS (R,J,F) .BYTE 0 ;TIMER COUNTER .BYTE 0 ;RESET COUNT .WORD ITIMFB ;FLAG BYTE ADDRESS .WORD 0 ;FLAG MASK(UNIT NO.) .WORD TTYITAVE JUST CONDITION CODES. PSTP MOV (SP)+,$PCSAV ; GET PC OF TRAP (BEFORE) PSTP MOV (SP)+,$OLDPS ; GET PS OF TRAP (BEFORE) PSTP INC $PSTCT ; COUNT NUMBER OF TRAPS. PSTP TST ACTIVE ; TASK OR ROS? PSTP BNE PSTB00 ; BRANCH IF TASK PSTP PSHALT: HALT ; HALT IF ROS SINCE ROS IS, BY PSTP TST (SP)+ ; POP OF TOP OF STACT (TEMP ERROR STAT) QUEU QUEC16 =. ; HERE TO GO HOME FROM ERROR CONDITION QUEU MOVB R3,@#PS ; ALLOW INTERRUPTS QUEU .IFG RGSAVE ; QUEU MOV (SP)+,R4 ; RESTORE QUEU MOV (SP)+,R3 ; THE QUEU MOV (SP)+,R2 ; CALLERA ; CN12: .WORD 0 ; .END ; O ;TIMEOUT ROUTINE ADDRESS ITIME1: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD ITIMFB,1,TTYITO ITIME2: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD ITIMFB,2,TTYITO ITIME3: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD ITIMFB,3,TTYITO ITIME4: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD ITIMFB,4,TTYITO ITIME5: .WORD 1 .B BR PSHALT ; DEFINITION, ERROR FREE. PSTP PSTB00 =. ; HERE IF A TASK. PSTP .IFLE $PST ; INCLUDE IFF ROS TRAP HANDLER USED. PSTP MOV $CTASK,-(SP) ; PUSH TASK# ON STACK FOR ABORT PSTP JSR PC,ABORT ; ABORT THE TASK. PSTP MOV #PSMES1,R2 ; THEN NEED TO SET UP MESSAGES, IF ANY.PSTP CMP (R2),#1 ; BLOCK #1'S QUEU MOV (SP)+,R1 ; REGISTERS QUEU .ENDC QUEU TST MFLAG ; IS MFLAG SET? IF SO MUST RETURN TO BNE QUEC20 ; TO THE CALLER. TST IRTRN-SAVE-2(SP); SEE WHAT KIND OF RETURN IS REQUESTED? QUEU BNE QUED00 ;BRANCH IF WE ARE SUPPOSED TO CALL DSPTC ; YTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD ITIMFB,5,TTYITO ITIME6: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD ITIMFB,6,TTYITO ITIME7: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD ITIMFB,7,TTYITO ITIMSZ = ITIME1-ITIME0 ;DELETE UNUSED MODULES . = ITIMSZ*NTTYS+ITIME0 .IFG NTTYS-8. ;IF NTTYS .GT. 8? XXXXXX ;CREATE ASSY ERROR, NTTYS GT 8 FREE? PSTP BEQ PSTB10 ; YES. PSTP MOV #PSMES2,R2 ; NO. IS BLOCK #2 FREE? PSTP CMP (R2),#1 ; PSTP BNE PSTC00 ; NO. PSTP PSTB10: MOVB $CTASK,4(R2) ; YES. SET UP BLOCK. FIRST TASK NO. PSTP MOV $TCODE,6(R2) ; THEN TYPE CODE. PSTP QUEU QUEC20 =. ; HERE TO RETURN TO THE CALLER QUEU ; QUEU MOV (SP),NARG-SAVE-4(SP) ; RESET PC FOR RTS P QUEU ADD #NARG-SAVE-4,SP ; MOVE SP ITSELF QUEU RTS PC ;OTHERWISE, RETURN TO CALLER ; QUED00 =. ; HERE TO CALL THE DISPATCHER QUEU ; RT = 0 ;EOM PRINT OPTION WHERE ; 1 = EOM IS PRINTED ; 0 = EOM IS NOT PRINTED EOLCH = 12 ;CHAR BEING USED FOR END OF LINE ON ;TTY INPUT ECHOCH = 40 ;ECHO CHAR -- CHAR OUTPUT FOR NO ECHO MRCH = 25 ;MESSAGE RESTART CHAR (CONTROL U) LINELN = 72. ;LINE LENGTH: NO. OF CHARS TO BE !! .ENDC ; ; ; OUTPUT TIMER MODULES ; OTIME0: .WORD 1 ;THREAD WORD .BYTE 0 ;TASK NO. (N/A) .BYTE MSECR!TJOPTN!TFOPTN ;OPTION FLAGS (R,J,F) .BYTE 0 ;TIMER COUNTER .BYTE 0 ;RESET COUNT .WORD OTIMFB ;FLAG BYTE ADDRESS .WORD 0 ;FLAG MASK (DEV. NO.) .WORD TTYOTO ;TIMEOUT ROUTINE ADDR MOV $PCSAV,8.(R2) ; THEN PC OF TRAP. PSTP CLR -(SP) ; THEN PRINT ERROR MESSAGE. RETURN PSTP MOV R2,-(SP) ; OUT OF LOCKOUT PSTP JSR PC,LERTYP ; PSTP PSTC00 =. ; HERE WHEN MESSAGE, IF ANY, IS DONE. PSTP .ENDC PSTP .IFNZ $PST ; INCLUDE IFF US QUEU MOV @#PS,IERR-SAVE-4(SP) ; FIX STACK SO THAT ONLY THE QUEU MOV (SP),IERR-SAVE-6(SP) ; STATUS IS LEFT. FASTEST TO QUEU ADD #IERR-SAVE-6,SP ; USE 'QSAVEI' SO FIX STACK FOR QUEU MOV #1,-(SP) ; THAT CALL. SUSPENSION IS QUEU JSR PC,QSAVEI ; INVOLUNTARY. STACK LOOKS LIKEQUEU ; ;TYPED IN A LINE .PAGE ESS OTIME1: .WORD 1 .BYTE 0,MSECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD OTIMFB,1,TTYOTO OTIME2: .WORD 1 .BYTE 0,MSECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD OTIMFB,2,TTYOTO OTIME3: .WORD 1 .BYTE 0,MSECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD OTIMFB,3,TTYOTO OTIME4: .WORD 1 .BYTE 0,MSECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD OTIMFB,4,TTYOTO OTIME5: .WORD 1 .BYTE 0,MSECR!TJOPTN!TFOPTN ER TRAP HANDLER USED. PSTP .IFG $PST ; ONLY INCLUDE IF ONLY USER ROUTINE PSTP TST (SP)+ ; GET RID OF PC FROM STACK PSTP MOVB (SP)+,@#PS ; RESET CPU LEVEL TO THAT BEFORE TRAP PSTP .ENDC PSTP JSR PC,UPST ; TRANSFER TO THE USERS ROUTINE PSTP .ENDC PSTP JMP QUEU ; PS QUEU ; PC (FOR RETURN OF CONTROL) QUEU ; ARG (=1) QUEU ; PC (OF THIS CALL) QUEU ; QUEU JMP DSPTCH ;THEN LET DSPTCH DO ITS THING ; ; ; THE FOLLOWING ARE ERROR PROCEU ; PC (FOR RETURN OF CONTROL) QUEU ; ARG (=1) QUEU ; PC (OF THIS CALL) QUEU ; QUEU JMP DSPTCH ;THEN LET DSPTCH DO ITS THING ; ; ; THE FOLLOWING ARE ERROR PROCESSING FUNCTIONS; SET IERR ; ACCORDING TO THE ERROR, THEN RETURN TO CALLER. .BYTE 0,0 .WORD OTIMFB,5,TTYOTO OTIME6: .WORD 1 .BYTE 0,MSECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD OTIMFB,6,TTYOTO OTIME7: .WORD 1 .BYTE 0,MSECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD OTIMFB,7,TTYOTO OTIMSZ = OTIME1-OTIME0 ;DELETE UNUSED MODULES . = OTIMSZ*NTTYS+OTIME0 .IFG NTTYS-8. ;IF NTTYS GT 8 XXXXXX ;CREATE ASSY ERROR, NTTYS GT 8!! .ENDC ; ; ; DSPTCH ; FINALLY FINISH UP. PSTP .IFLE $PST ; INCLUDE IFF ROS TRAP HANDLER USED. PSTP PSMES1: .WORD 1 ; ERROR BLOCK #1. THREAD WORD. PSTP .WORD 90. ; ERROR NUMBER PSTP .WORD 0,0,0,0 ; FOUR ARGUMENTS PSTP PSMES2: .WORD 1 ; ERROR BLOCK #2. THREAD WORD PSTP .WORD 90. ; ERROR NUMBER ESSING FUNCTIONS; SET IERR ; ACCORDING TO THE ERROR, THEN RETURN TO CALLER. ; ; QUEE70: INC (SP) ; QPART FULL QUEU QUEE60: INC (SP) ; OVERLAY FOR NON-OVERLAY PRIORITY LEVELQUEU QUEE50: INC (SP) ; ILLEGAL TASK NUMBERS QUEU QUEE40: INC (SP) ; DISABLED TASK QUEU QUEE30: INC (SP) ; ABORTED TASK WITH I/O IN PROGRESS QUEU QUEE20: INC (SP) ; ; QUEE70: INC (SP) ; QPART FULL QUEU QUEE60: INC (SP) ; OVERLAY FOR NON-OVERLAY PRIORITY LEVELQUEU QUEE50: INC (SP) ; ILLEGAL TASK NUMBERS QUEU QUEE40: INC (SP) ; DISABLED TASK QUEU QUEE30: INC (SP) ; ABORTED TASK WITH I/O IN PROGRESS QUEU QUEE20: INC (SP) ; TASK STATUS NON-QUIESCENT AND NOT ABRTQUEU QUEE10: INC (SP) ; WAIT TIMER MODULES ; WTIME0: .WORD 1 ;THREAD WORD .BYTE 0 ;TASK NO. (N/A) .BYTE SECR!TJOPTN!TFOPTN ;OPTION FLAGS (R,J,F) .BYTE 0 ;TIMER COUNTER .BYTE 0 ;RESET COUNT .WORD WTIMFB ;FLAG BYTE ADDRESS .WORD 0 ;FLAG MASK (UNIT NO.) .WORD TTYOON ;TIMEOUT ROUTINE ADDRESS WTIME1: .WORD 1 PSTP .WORD 0,0,0,0 ; FOUR ARGUMENTS PSTP .ENDC PSTP $PSTCT: .WORD 0 ; TOTAL NUMBER OF TRAPS PSTP $OLDPS: .WORD 0 ; SAVE PS FROM BEFORE THE TRAP PSTP $PCSAV: .WORD 0 ; SAVE PC FROM BEFORE THE TRAP PSTP $TCODE: .WORD 0 ; TYPE OF TRAP. THE CODE IS: PSTP ; TASK STATUS NON-QUIESCENT AND NOT ABRTQUEU QUEE10: INC (SP) ; TASK THREAD WORD NOT =1. QUEU CLR IRTRN(SP) ; FORCE RETURN TO CALLER QUEU MOV (SP)+,IERR-2(SP); SET ERROR STATUS FOR RETURN QUEU BR QUEC16 ; RETURN TO CALLER AFTER RESTORATION. QUEU ; ; ; THIS SECTION SETS UP THE REGISTERS, THEN LINKS TO QOVLAY TO ; PROCESS THE OVERLAY TASK REQUEST. THE STACK AT ENTRY TO ; TASK THREAD WORD NOT =1. QUEU CLR IRTRN(SP) ; FORCE RETURN TO CALLER QUEU MOV (SP)+,IERR-2(SP); SET ERROR STATUS FOR RETURN QUEU BR QUEC16 ; RETURN TO CALLER AFTER RESTORATION. QUEU ; ; ; THIS SECTION SETS UP THE REGISTERS, THEN LINKS TO QOVLAY TO ; PROCESS THE OVERLAY TASK REQUEST. THE STACK AT ENTRY TO ; QUEH00 AND JUST PRIOR TO THE JSR TO QOVLAY, LOOKS LIKE: ; ; IT .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD WTIMFB,1,TTYOON WTIME2: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD WTIMFB,2,TTYOON WTIME3: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD WTIMFB,3,TTYOON WTIME4: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD WTIMFB,4,TTYOON WTIME5: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD ; BIT 0 (C) = BUS ERROR (4) PSTP ; BIT 1 (V) = RESERVED INSTRUCTION(10)PSTP ; BIT 2 (Z) = IOT (20) PSTP .END ; PSTP QUEH00 AND JUST PRIOR TO THE JSR TO QOVLAY, LOOKS LIKE: ; ; ITASK CURRENT QUEU ; IPRTY (SYSGEN) QUEU ; IARG (SYSGEN) QUEU ; IRTRN QUEU ; PC (FROM CALLER) QUEU ; R1 ASK CURRENT QUEU ; IPRTY (SYSGEN) QUEU ; IARG (SYSGEN) QUEU ; IRTRN QUEU ; PC (FROM CALLER) QUEU ; R1 QUEU ; R2 WTIMFB,5,TTYOON WTIME6: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD WTIMFB,6,TTYOON WTIME7: .WORD 1 .BYTE 0,SECR!TJOPTN!TFOPTN .BYTE 0,0 .WORD WTIMFB,7,TTYOON WTIMSZ = WTIME1-WTIME0 ;DELETE UNUSED MODULES . = WTIMSZ*NTTYS+WTIME0 .IFG NTTYS-8. ;IF NTTYS .GT. 8? XXXXXX ;CREATE ASSY ERROR, NTTY GT 8!! .ENDC ; ; TIMER MODULE FLAG BYTES ; ; QUEU ; R2 QUEU ; R3 QUEU ; R4 QUEU ; TEMP ERROR STATUS CURRENT QUEU ; R3 (PS VALUE) ADDED FOR RPOM QUEU ; R4 (TASK #) QUEU ; QUEU ; R3 QUEU ; R4 QUEU ; TEMP ERROR STATUS CURRENT QUEU ; R3 (PS VALUE) ADDED FOR RPOM QUEU ; R4 (TASK #) QUEU ; R1 (PRIORITY-ALWAYS) QUEU ; ARG/0 ITIMFB: .BYTE 0 ;INPUT TIMER FLAG BYTE (UNIT NO.) OTIMFB: .BYTE 0 ;OUTPUT TIMER FLAG BYTE (UNIT NO.) WTIMFB: .BYTE 0 ;WARMUP TIMER FLAG BYTE (UNIT NO.) ; ; ; PROGRAM VARIABLES ; TTYPRT: .BYTE -1,-1,-1,-1,-1,-1,-1,-1 ;UNIT STATUS ; <0 = UNIT NOT BUSY ; 0 = INPUT HAS PRIORITY ; >0 = OUTPUT HAS PRIORITY . = TTYPRT+NTTYS TTO1STR1 (PRIORITY-ALWAYS) QUEU ; ARG/0 (ALWAYS) QUEU ; PC (CALL TO RPOM) ADDED FOR RPOM QUEU ; ; .IFNZ OVRLAY QUEH00 = . MOV R3,-(SP) ; SAVE R3 FOR LATER USE QUEU MOV R4,-(SP) ; PUT TASK NUMBER ON STACK QUEU MOV R1,-(SP) ; PUT PRIORITY ON STACK QUEU (ALWAYS) QUEU ; PC (CALL TO RPOM) ADDED FOR RPOM QUEU ; ; .IFNZ OVRLAY QUEH00 = . MOV R3,-(SP) ; SAVE R3 FOR LATER USE QUEU MOV R4,-(SP) ; PUT TASK NUMBER ON STACK QUEU MOV R1,-(SP) ; PUT PRIORITY ON STACK QUEU .IFZ ARG ; PUT EITHER A ZERO (IF NO PASSED QUEU CLR : .BYTE 0,0,0,0,0,0,0,0 ;FIRST OUTPUT REQUEST FLAG ; 0 = FIRST REQUEST ; 1 = SUBSEQUENT REQUEST . = TTO1ST+NTTYS TTI1ST: .BYTE 0,0,0,0,0,0,0,0 ;FIRST INPUT REQUEST FLAG ; 0 = FIRST REQUEST ; 1 = SUBSEQUEST REQUEST . = TTI1ST+NTTYS TTORPT: .BYTE 0,0,0,0,0,0,0,0 ;REPEAT COUNT FOR OUTPUT TRYS . = TTORPT+NTTYS TTCURS: .BY .IFZ ARG ; PUT EITHER A ZERO (IF NO PASSED QUEU CLR -(SP) ; ARGUMENT) OR THE PASSED ARGUMENT QUEU .ENDC ; ON THE STACK. QUEU .IFNZ ARG ; QUEU MOV IARG+4(SP),-(SP); QUEU .ENDC QUEU JSR PC,QOVLAY ; CALL ON RPOM -(SP) ; ARGUMENT) OR THE PASSED ARGUMENT QUEU .ENDC ; ON THE STACK. QUEU .IFNZ ARG ; QUEU MOV IARG+4(SP),-(SP); QUEU .ENDC QUEU JSR PC,QOVLAY ; CALL ON RPOM QUEU MOV (SP)+,R0 ; GET ERROR STATUS TE 0,0,0,0,0,0,0,0 ;CURSOR FOR CURRENT PRINT POSN OF DEVICE . = TTCURS+NTTYS FRSTRO: .BYTE 0,0,0,0,0,0,0,0 ;FIRST RUBOUT SWITCH ; SET TO 1 WHEN 1ST RO IS INPUT ; RESET TO 0 WHEN 1ST NON-RO CHAR ; IS INPUT . = FRSTRO+NTTYS SLSHCH: .BYTE 0,0,0,0,0,0,0,0 ;CHAR TO BE ECHOED AFTER "\" . = SLSHCH+NTTYS MAXCH: .BYTE 0,0,0,0,0,0,0,0 ;SET TO 1 WHEN MAX CHARS EX QUEU MOV (SP)+,R0 ; GET ERROR STATUS QUEU MOVB (SP)+,R3 ; RESET R3 (PS VALUE) QUEU TST R0 ; TEST STATUS QUEU BEQ QUEC15 ; ALL IS OK HERE QUEU BLT QUEE60 ; NON-OVERLAY PRIORITY QUEU BR QUEE70 ; QPART FULL QUEU .END QUEU MOVB (SP)+,R3 ; RESET R3 (PS VALUE) QUEU TST R0 ; TEST STATUS QUEU BEQ QUEC15 ; ALL IS OK HERE QUEU BLT QUEE60 ; NON-OVERLAY PRIORITY QUEU BR QUEE70 ; QPART FULL QUEU .ENDC QUEU .PAGE ;***CEEDED ; ON INPUT . = MAXCH+NTTYS CHTYPE: .BYTE 0,0,0,0,0,0,0,0 ;CHARACTER TYPE: USED IN TTY PRINTER ; INTERRUPT ROUTINE TO IDENTIFY ; TYPE OF CHAR LAST OUTPUT ; ; 0 = CHAR FROM OUTPUT MSG ; 1 = ECHO OF INPUT CHAR ; 2 = ECHO OF LF C QUEU .PAGE ;*********************************************************************** ; * ; Q S A V E & Q S A V E I * ; * ; PROGRAM IDENTIFICATION: QSAVE & QSAVEI * ; QSAVE - SAVE A TASKS ENVI******************************************************************** ; * ; Q S A V E & Q S A V E I * ; * ; PROGRAM IDENTIFICATION: QSAVE & QSAVEI * ; QSAVE - SAVE A TASKS ENVIROMENT * ; QSAVEI - SAVE A TASKS ENVIROMENT AFTER ; 3 = ECHO OF CR ; 4 = ECHO OF "U" ; 5 = ECHO OF "^" ; 6 = ECHO OF 1ST "^" ; 7 = ECHO OF "\" ; 8. = ECHO OF EOM CHAR ; 9. = INTERRUPT FROM OUTPUT OF ; LF IN OUTPUT MODE ; 10. = INTERRUPT FROROMENT * ; QSAVEI - SAVE A TASKS ENVIROMENT AFTER * ; AN INTERUPT * ; * ; * ; PURPOSE: THIS ROUTINE IS USED TO SAVE A TASKS ENVIRONMENT * ; WHENEVER IT IS SUSPENDED. IF THE SUSPENSION IS * ; INVOLUNTARY, THE ROUTINE UNSPND M * ; AN INTERUPT * ; * ; * ; PURPOSE: THIS ROUTINE IS USED TO SAVE A TASKS ENVIRONMENT * ; WHENEVER IT IS SUSPENDED. IF THE SUSPENSION IS * ; INVOLUNTARY, THE ROUTINE UNSPND MAY BE CALLED TO * ; REQUEUE THE TASK. THE ARGUMENT ARG WHICH ISM OUTPUT OF ; CR IN OUTPUT MODE ; 11. = INTERRUPT FROM ECHO OF ; CR AFTER EOM ; 12. = INTERRUPT FROM ECHO OF ; LF AFTER EOM ; 13. = INTERRUPT FROM OUTPUT OF ; A RUBOUT TO TURN ON TTY ; FOR INPUT AY BE CALLED TO * ; REQUEUE THE TASK. THE ARGUMENT ARG WHICH IS PASSED * ; ON THE TASK STACK WILL DETERMINE THIS FUNCTION. IF * ; AN OVERLAY TASK IS VOLUNTARILY SUSPENDED, THE * ; SUBROUTINE QSOVLY WILL BE CALLED TO CONTROL THE USE * ; OF THE PARATION. * ; * ; USAGE: BOTH ENTRY POINTS ARE USE PASSED * ; ON THE TASK STACK WILL DETERMINE THIS FUNCTION. IF * ; AN OVERLAY TASK IS VOLUNTARILY SUSPENDED, THE * ; SUBROUTINE QSOVLY WILL BE CALLED TO CONTROL THE USE * ; OF THE PARATION. * ; * ; USAGE: BOTH ENTRY POINTS ARE USED WITH A 'JSR PC'. THE * ; ENTRY POINT 'QSAVE' IS USED UNLESS TH . = CHTYPE+NTTYS TOFLAG: .BYTE 0,0,0,0,0,0,0,0 ;OUTPUT TIMEOUT FLAG WHERE ; 1 = TIMEOUT OCCURRED ; 0 = NO TIMEOUT OCCURRED . = TOFLAG+NTTYS FRSTTO: .BYTE 0,0,0,0,0,0,0,0 ;FIRST TIMEOUT FLAG ; 1 = TIMEOUT ERROR MSG TYPEOUT ; PREVIOUSLY REQUESTED ; 0 = 1ST TIMEOUT HAS NOT OCCURED . = FRSTTO+NTTYD WITH A 'JSR PC'. THE * ; ENTRY POINT 'QSAVE' IS USED UNLESS THE CALL IS THE * ; RESULT OF AN INTERRUPT IN WHICH CASE 'QSAVEI' IS USED.* ; * ; AT THE CALL THE TASK STACK IS ASSUMMED TO LOOK AS * ; FOLLOWS: * ; * ; QSAVE E CALL IS THE * ; RESULT OF AN INTERRUPT IN WHICH CASE 'QSAVEI' IS USED.* ; * ; AT THE CALL THE TASK STACK IS ASSUMMED TO LOOK AS * ; FOLLOWS: * ; * ; QSAVE QSAVEI * ; PC FROM TASK S TOIFLG: .BYTE 0,0,0,0,0,0,0,0 ;INPUT TIMEOUT FLAG WHERE ; 1 = TIMEOUT OCCURRED ; 0 = NO TIMEOUT OCCURRED . = TOIFLG+NTTYS TTYON: .BYTE 1,1,1,1,1,1,1,1 ;TELETYPE MOTOR ON/OFF FLAG ; 0 = ON ; 1 = OFF . = TTYON+NTTYS .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM NXTSEC: .BYTE 0,0,0,0,0,0,0,0 ;NEXT SECTOR AVAILABL  QSAVEI * ; PC FROM TASK PS *QSVE ; PS FROM TASK PC *QSVE ; ARG ARGUMENT ARG * ; PC FROM JSR PC PC <== STACK POINTER* ; * ; AFTER THE CALL THE TASK STACK IS AS FOLLOWS: * ;  PS *QSVE ; PS FROM TASK PC *QSVE ; ARG ARGUMENT ARG * ; PC FROM JSR PC PC <== STACK POINTER* ; * ; AFTER THE CALL THE TASK STACK IS AS FOLLOWS: * ; * ; R0 E(RELATIVE TO 1ST .BYTE 0,0,0,0,0,0,0,0 ;SECTOR OF FILE) FOR DISC MSG BUFFER . = NXTSEC+NTTYS+NTTYS NXTMSG: .BYTE 0,0,0,0,0,0,0,0 ;NEXT MESSAGE SECTOR ADDRESS (RELATIVE .BYTE 0,0,0,0,0,0,0,0 ;TO 1ST SECTOR OF FILE) IN DISC MSG ;BUFFER . = NXTMSG+NTTYS+NTTYS DAVAIL: .BYTE 1,1,1,1,1,1,1,1 ;DISC FILE AVAILABLE .BYTE 1,1,1,1,1,1,1,1 ; 1 = AVAIL 0 = NOT AVAIL . = DAVAIL+NTTYS+NTTYS DBFULL: .BYTE  * ; R0 * ; PC * ; R5 * ; R4 * ; R3 * ; R2 * ;  * ; PC * ; R5 * ; R4 * ; R3 * ; R2 * ; R1 <=TOP OF STACK * ; 0,0,0,0,0,0,0,0 ;DISC BUFFER FILE FULL FLAG .BYTE 0,0,0,0,0,0,0,0 ; 1 = FULL 0 = NOT FULL . = DBFULL+NTTYS+NTTYS DWLIU: .BYTE 0 ;DISC WRITE I/O LIST IN USE FLAG ; 1 = IN USE 0 = AVAIL .ENDC ; ; .EVEN ; OLSTAD: .WORD 0,0,0,0,0,0,0,0 ;CURRENT OUTPUT LIST ADDRESS ;BIT 0 IS SET WHEN LIST ;RESIDES IN WORKING OUTPUT BUFFER . =  R1 <=TOP OF STACK * ; * ; THE PROGRAM HEADER WILL MODIFIED AS SHOWN: * ; * ; WORD 7, BYTE 0 - TASK PS (FROM STACK IF QSAVEI * ; OR ON ENTRY IF QSAVE)* ; WORD 5 - CURRENT TIMER * ;  * ; THE PROGRAM HEADER WILL MODIFIED AS SHOWN: * ; * ; WORD 7, BYTE 0 - TASK PS (FROM STACK IF QSAVEI * ; OR ON ENTRY IF QSAVE)* ; WORD 5 - CURRENT TIMER * ; WORD 8 - TOP OF TASK STACK AFTER ALL * ;  OLSTAD+NTTYS+NTTYS ILSTAD: .WORD 0,0,0,0,0,0,0,0 ;CURRENT INPUT LIST ADDRESS . = ILSTAD+NTTYS+NTTYS QFIRST: .WORD 0,0,0,0,0,0,0,0 ;ADDRESS OF 1ST LIST IN CORE QUEUE .WORD 0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0 . = QFIRST+NTTYS+NTTYS+NTTYS+NTTYS+NTTYS+NTTYS+NTTYS+NTTYS QLAST: .WORD QFIRST,QFIRST+2 ;ADDRESS OF LAST LIST IN CORE QUEUE .WORD QFIRST+4,QFIRST+6 .WORD QFIRST+8.,QFIRST+10.  WORD 8 - TOP OF TASK STACK AFTER ALL * ; PUSHES TO SAVE * ; REGISTERS * ; * ; THE TASK TABLE WILL HAVE THE TASK STATUS SET AS SHOWN:* ; * ; 2 - TASK INVOLUNTARILY SUSPENDED - RE-QUEUED PUSHES TO SAVE * ; REGISTERS * ; * ; THE TASK TABLE WILL HAVE THE TASK STATUS SET AS SHOWN:* ; * ; 2 - TASK INVOLUNTARILY SUSPENDED - RE-QUEUED *QSVE ; 4 - TASK VOLUNTARILY SUSPENDED *QSVE .WORD QFIRST+12.,QFIRST+14. .WORD QFIRST+16.,QFIRST+18. .WORD QFIRST+20.,QFIRST+22. .WORD QFIRST+24.,QFIRST+26. .WORD QFIRST+28.,QFIRST+30. .WORD QFIRST+32.,QFIRST+34. .WORD QFIRST+36.,QFIRST+38. .WORD QFIRST+40.,QFIRST+42. .WORD QFIRST+44.,QFIRST+46. .WORD QFIRST+48.,QFIRST+50. .WORD QFIRST+52.,QFIRST+54. .WORD QFIRST+56.,QFIRST+58. .WORD QFIRST+60.,QFIRST+62 *QSVE ; 4 - TASK VOLUNTARILY SUSPENDED *QSVE ; 5 - TASK INVOLUNTARILY SUSPENDED *QSVE ; * ; THE TYPE OF CALL ON QSAVE & QSAVEI IS DETERMINED BY * ; THE VALUE OF THE ARGUMENT ARG ON THE STACK. ITS VALUES* ; ARE: * ;  ; 5 - TASK INVOLUNTARILY SUSPENDED *QSVE ; * ; THE TYPE OF CALL ON QSAVE & QSAVEI IS DETERMINED BY * ; THE VALUE OF THE ARGUMENT ARG ON THE STACK. ITS VALUES* ; ARE: * ; * ; NEGATIVE - INVOLUNTARY SUSPENSION . . = QLAST+NTTYS+NTTYS+NTTYS+NTTYS+NTTYS+NTTYS+NTTYS+NTTYS .PAGE ; ; ; TELETYPE OUTPUT REQUEST PROCESSOR ; ; CALLING SEQUENCE -- ; ; MOV #LIST,-(SP) ;PUSH I/O LIST ADDRESS ON STACK ; EMT TTYOUT ;CALL TTYOUT ; TTYOUT = . JSR R5,PUSHR ;SAVE R0-R5 ON CURRENT STACK JSR PC,REQPP ;CALL REQUEST LIST PREPROCESSOR BNE TTOR20 ;BRANCH ON LIST ERROR  * ; NEGATIVE - INVOLUNTARY SUSPENSION NO-REQUEUE* ; POSITIVE - INVOLUNTARY SUSPENSION RE-QUEUE * ; EQUAL ZERO - VOLUNTARY SUSPENSION * ; * ; NOTE: IF UNSPND IS CALLED TO RE-QUEUE THE SUSPENDED * ; TASK, THE PRIORITY LEVEL WILL BE TAKEN FROM * ; THE PROGRAM HEADE NO-REQUEUE* ; POSITIVE - INVOLUNTARY SUSPENSION RE-QUEUE * ; EQUAL ZERO - VOLUNTARY SUSPENSION * ; * ; NOTE: IF UNSPND IS CALLED TO RE-QUEUE THE SUSPENDED * ; TASK, THE PRIORITY LEVEL WILL BE TAKEN FROM * ; THE PROGRAM HEADER. * ;  .IFZ MSGBUF ;ASSEM FOLLOWING FOR CORE VERSION CLR R4 ;SET QLIST FOR OUTPUT QUEUING JSR PC,QLIST ;Q LIST TO PROPER UNIT/LEVEL QUEUE .ENDC JSR PC,LOCOUT ;LOCKOUT INTERRUPTS TSTB TTO1ST(R1) ;IS THIS 1ST OUTPUT REQUEST FOR UNIT? BEQ TTOR45 ;YES, GO INITIATE OUTPUT .IFG MSGBUF TTOR02 = . TSTB DAVAIL(R3) ;IS DISC FILE FOR THIS DEV/LEVEL A!R. * ; * ; PROGRAMMER: 53 * ; DATE: 20-AUG-71 * ; VERSION: V001A * ; CATALOGUE NUMBER: * ; * ;*******************************" * ; PROGRAMMER: 53 * ; DATE: 20-AUG-71 * ; VERSION: V001A * ; CATALOGUE NUMBER: * ; * ;*********************************************************************** .PAGE .DEF QSAVE,QSAVEI#VAIL BEQ TTOR30 ;NO, GO QUEUE REQUEST TSTB DBFULL(R3) ;IS THIS DISC BUFFER FULL? BGT TTOR30 ;YES, GO Q LIST CMP DWLIST,#1 ;IS DISC I/O LIST THREADABLE BNE TTOR30 ;NO, GO Q TTY OUTPUT REQUEST TSTB DWLIU ;IS DISC WRITE I/O LIST IN USE? BGT TTOR30 ;YES, GO Q LIST INCB DWLIU ;NO, SET DISC WRITE I/O LIST IN USE FLAG MOVB (SP)+,PS %**************************************** .PAGE .DEF QSAVE,QSAVEI .REF STACK ; QSVE .IFNZ OVRLAY ; QSVE .REF QSOVLY ; QSVE .ENDC QSVE ; QSVE ; QSAVE ENTRY POINT & .REF STACK ; QSVE .IFNZ OVRLAY ; QSVE .REF QSOVLY ; QSVE .ENDC QSVE ; QSVE ; QSAVE ENTRY POINT QSVE ; ' ;YES,RELEASE LOCKOUT JSR PC,DISCWT ;CALL DISC WRITE ROUTINE MOV ERROR(R0),R4 ;WAS THERE A DISK REQUEST ERROR? BEQ TTOR10 ;NO CMP R4,#ERRMSZ ;YES, IS ERROR A MSG SIZE WARNING BEQ TTOR10 ;YES JSR PC,LOCOUT ;LOCKOUT INTERRUPTS BR TTOR30 .ENDC .IFZ MSGBUF ;ASSEM FOLLOWING FOR CORE VERSION TTOR05 = . MOVB (SP)+,PS ;R) QSVE ; QSVE QSAVE =. ; QSVE MOV 6.(SP),-(SP) ; REVERSE ORDER OF PC & PS ON STACK QSVE MOV 6.(SP),8.(SP) ; TO CONFORM TO QSAVEI CALL - THE QSVE MOV (SP)+,4.(SP) ; MOST COMMON QSVE ; * * QSVE QSAVE =. ; QSVE MOV 6.(SP),-(SP) ; REVERSE ORDER OF PC & PS ON STACK QSVE MOV 6.(SP),8.(SP) ; TO CONFORM TO QSAVEI CALL - THE QSVE MOV (SP)+,4.(SP) ; MOST COMMON QSVE ; * ; QSAVEI ENTRY POINT - ONLY IF INTERRUPT CAUSED CALL QSAVEI =. MOVB @#PS+ELEASE LOCKOUT .ENDC ; ; EXIT PROCESSING FOR REQUEST ; TTOR10 = . CMPB TYPE(R0),#3 ;IS EXIT TYPE 3? BNE TTOR35 ;NO, MUST BE TYPE 1 OR 2 TTOR15 = . JSR R5,POPR ;POP REGISTERS OFF STACK MOV (SP)+,(SP) ;SWAP PC & LIST ADDR; POP STACK RTS PC ;RETURN ; ; PROCESSING FOR INVALID REQUEST ; TTOR20 = . MOVB ERRTSK(R0),R4 ;IS THERE AN ERROR TASK -; QSAVEI ENTRY POINT - ONLY IF INTERRUPT CAUSED CALL QSAVEI =. MOVB @#PS,-(SP) ; SAVE PS QSVE MOVB #340,@#PS ; LOCK OUT ALL INTERRUPTS QSVE TST ACTIVE ; IS A JOB ACTIVE? QSVE BEQ QSI300 ; NO. RETURN QSVE CLR ACTIVE ; PREVENT DOUBLE SUSPENSION QSVE MOVB (SP)+,@#PS ; ALLOW INTERRUPTS .,-(SP) ; SAVE PS QSVE MOVB #340,@#PS ; LOCK OUT ALL INTERRUPTS QSVE TST ACTIVE ; IS A JOB ACTIVE? QSVE BEQ QSI300 ; NO. RETURN QSVE CLR ACTIVE ; PREVENT DOUBLE SUSPENSION QSVE MOVB (SP)+,@#PS ; ALLOW INTERRUPTS QSVE ; ; THE TASK STACK NOW LOOKS THIS WAY: ; PS /TO BE QUEUED? BEQ TTOR25 ;NO MOV R4,-(SP) ;YES, PUSH TASK NO. ON STACK .IFG DPRTY CLR -(SP) ;PUSH IPRTY ONTO STACK .ENDC .IFG ARG MOV ERROR(R0),-(SP) ;PUSH ERROR CODE AS ARG .ENDC CLR -(SP) ;PUSH IRTRN ONTO STACK JSR PC,QUEUE ;QUEUE ERROR TASK TST (SP)+ ;POP ERROR CODE OFF STACK TTOR25 = . CMP ERROR(1 QSVE ; ; THE TASK STACK NOW LOOKS THIS WAY: ; PS ; PC (TASK PC) ; ARG ; PC (FROM JSR PC) <=== TASK STACK POINTER QSVE ; ; COMMON CODE -- QSAVE & QSAVEI QSC100 =. MOV R3,-(SP) ; SAVE R3 ON TASK STACK QSVE MOV R2,-(SP) ; SAVE R2 ON TASK STACK MOV R1,-(SP) ; SAVE R1 ON TASK STACK MOV +8.(SP),R1 ; GET ARG FROM STA2; PC (TASK PC) ; ARG ; PC (FROM JSR PC) <=== TASK STACK POINTER QSVE ; ; COMMON CODE -- QSAVE & QSAVEI QSC100 =. MOV R3,-(SP) ; SAVE R3 ON TASK STACK QSVE MOV R2,-(SP) ; SAVE R2 ON TASK STACK MOV R1,-(SP) ; SAVE R1 ON TASK STACK MOV +8.(SP),R1 ; GET ARG FROM STACK MOV R5,+8.(SP) ; SAVE R5 ON TASK STACK MOV $CTASK,R3R0),#ERRQL ;WAS THERE A QUEUEING ERROR? BEQ TTOR27 ;YES, THREAD WORD WAS ALLREADY RESTORED INC (R0) ;INCR LIST THREAD WORD TO ORIGINAL STATE TTOR27 = . BR TTOR15 ;GO RETURN .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM ; ; CORE QUEUING WHEN REQUIRED IN A MESSAGE BUFFERRED SYSTEM ; TTOR30 = . CLR R4 JSR PC,QLIST ;Q LIST TO PROPER UNIT/LEVEL Q BR5CK MOV R5,+8.(SP) ; SAVE R5 ON TASK STACK MOV $CTASK,R2 ; PUT ADDRESS OF PROGRAM HEADER QSVE ASL R2 ; MAKE R2 INTO WORD INDEX QSVE MOV HEADER(R2),R2 ; INTO R2. DON'T HAVE TASK NUMBER QSVE MOVB 12.(SP),CPUST(R2) ; SAVE PS IN TASK HEADER QSVE MOV R0,+12.(SP) ; SAVE R0 ON TASK STACK MOV SP,TSTACK(R2) ; SAVE TASK STACK POINTER IN HEADER 62 ; PUT ADDRESS OF PROGRAM HEADER QSVE ASL R2 ; MAKE R2 INTO WORD INDEX QSVE MOV HEADER(R2),R2 ; INTO R2. DON'T HAVE TASK NUMBER QSVE MOVB 12.(SP),CPUST(R2) ; SAVE PS IN TASK HEADER QSVE MOV R0,+12.(SP) ; SAVE R0 ON TASK STACK MOV SP,TSTACK(R2) ; SAVE TASK STACK POINTER IN HEADER MOV +6(SP),R0 ; SAVE PC VALUE TO RETURN MOV R4,+6(SP) ; 7 TTOR70 ;GO RELEASE LOCKOUT .ENDC TTOR35 = . MOVB SYSTEM(R0),R4 ;WAS REQUEST MADE BY A TASK? BEQ TTOR40 ;NO, BY SYSTEM DECB IOSTAT(R4) ;YES, DECR TASK I/O STATUS TTOR40 = . CMPB TYPE(R0),#1 ;IS EXIT TYPE 1? BEQ TTOR15 ;YES, RETURN TO CALLER JSR R5,POPR ;NO, IT IS TYPE 2, SO RESTORE REGISTERS, MOVB PS,2(SP) ;REPLACE LIST ADDR WITH PS 9MOV +6(SP),R0 ; SAVE PC VALUE TO RETURN MOV R4,+6(SP) ; SAVE R4 ON STACK CLR R4 ; CLEAR R4 FOR BYTE LOAD QSVE BISB TASKNO(R2),R4 ; GET TASK NUMBER FORM TASK HEADER QSVE MOVB @#PS,R3 ; SAVE PS QSVE MOVB #340,@#PS ; LOCK OUT ALL INTERUPTS QSVE MOV STACK,SP ; SWITCH TO SYSTEM STACK MOV R0,-(SP) ; PU:SAVE R4 ON STACK CLR R4 ; CLEAR R4 FOR BYTE LOAD QSVE BISB TASKNO(R2),R4 ; GET TASK NUMBER FORM TASK HEADER QSVE MOVB @#PS,R3 ; SAVE PS QSVE MOVB #340,@#PS ; LOCK OUT ALL INTERUPTS QSVE MOV STACK,SP ; SWITCH TO SYSTEM STACK MOV R0,-(SP) ; PUT RETURN PC ONTO SYSTEM STACK MOV COUNTR,CTIMER(R2) ; SAVE CURRENT; CLR -(SP) ;PUSH ZERO ON STACK TO INDICATE JSR PC,QSAVEI ;VOL SUSPENSION, SUSPEND CALLING TASK JMP DSPTCH ;EXIT TO DISPATCHER ; ; PROCESS 1ST OUTPUT REQUEST FOR A UNIT ; TTOR45 = . INCB TTO1ST(R1) ;RESET 1ST REQUEST FLAG FOR THIS UNIT .IFG MSGBUF ;ASSEM FOLLOWING FOR A MSG BUF SYSTEM MOVB (SP)+,PS ;RELEASE LOCKOUT MOV TTOBUF(R5),R4 ;GET ADDR OF WORKING =T RETURN PC ONTO SYSTEM STACK MOV COUNTR,CTIMER(R2) ; SAVE CURRENT TIMER VALUE IN ; PROGRAM HEADER CLR COUNTR ; CLEAR TIMER FOR THIS TASK. MOV #1,(R2) ; SET THREAD WORD TO 1 (QUEUEABLE) QSVE MOVB #5,TSTAT(R4) ; SET INVOLUNTARY SUSPENSION STATUS TST R1 ; VOLUNTARY OR INVOLUNTARY? BNE QSI100 ; BRANCH IF INVOLUNTARY DECB TS> TIMER VALUE IN ; PROGRAM HEADER CLR COUNTR ; CLEAR TIMER FOR THIS TASK. MOV #1,(R2) ; SET THREAD WORD TO 1 (QUEUEABLE) QSVE MOVB #5,TSTAT(R4) ; SET INVOLUNTARY SUSPENSION STATUS TST R1 ; VOLUNTARY OR INVOLUNTARY? BNE QSI100 ; BRANCH IF INVOLUNTARY DECB TSTAT(R4) ; RESET TASK STATUS TO VOLUNTARY (=4) .IFNZ OVRLAY ?OUTBUF FOR UNIT ADD #TTRLST,R4 ;MOVE INDEX TO WHERE TTY LIST WILL GO JSR PC,MOVLST ;MOVE LIST AND MSG DATA TO OUTPUT BUFFER INC R4 ;SAVE CURRENT LIST ADDRESS, SET MOV R4,OLSTAD(R5) ;LSB TO INDICATE WORKING BUFFER .ENDC .IFZ MSGBUF MOV R0,OLSTAD(R5) ;SAVE CURRENT OUTPUT LIST ADDRESS .ENDC .IFG MSGBUF ;ASSEM FOLLOWING FOR A MSG BUF SYSTEM JSR PC,LOATAT(R4) ; RESET TASK STATUS TO VOLUNTARY (=4) .IFNZ OVRLAY ; ROS 2 OR ROS 1? ONLY PUT IN CALL IF 2. CMPB R4,#OVTMIN ; IS THIS ANY OVERLAY TASK? QSVE BLO QSI200 ; NO. GO ALLOW INTERRUPTS AND RETURN. QSVE MOVB #1,TSTAT(R4) ; YES. SET RPOM'S STATUS QSVE MOVB R3,@#PS ; ALLOW INTERRUPTS BEFORE RPOM CALL QSVE MOV R4,-(SP) ; AND PUSH TASK NUMBER B; ROS 2 OR ROS 1? ONLY PUT IN CALL IF 2. CMPB R4,#OVTMIN ; IS THIS ANY OVERLAY TASK? QSVE BLO QSI200 ; NO. GO ALLOW INTERRUPTS AND RETURN. QSVE MOVB #1,TSTAT(R4) ; YES. SET RPOM'S STATUS QSVE MOVB R3,@#PS ; ALLOW INTERRUPTS BEFORE RPOM CALL QSVE MOV R4,-(SP) ; AND PUSH TASK NUMBER QSVE JSR PC,QSOVLY ; LET RPOM HANDLE THE PARTITION ASSIGN. CCOUT ;LOCKOUT INTERRUPTS .ENDC TSTB TTYPRT(R1) ;IS UNIT BUSY .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM BPL TTOR02 ;YES, GO PUT MSG IN DISC Q INC (R0) ;INCR USER LIST THREAD WORD TO ONE .ENDC .IFZ MSGBUF ;ASSEM FOLLOWING FOR CORE VERSION BPL TTOR05 ;YES, GO EXIT .ENDC MOVB #1,TTYPRT(R1) ;SET UNIT PRIORITY TO OUTPUT TTOR6E QSVE JSR PC,QSOVLY ; LET RPOM HANDLE THE PARTITION ASSIGN. .ENDC .IFZ OVRLAY ; NEED THIS CODE ONLY QSVE MOVB R3,@#PS ; FOR ROS 1. ROS 2 USES QSI200. QSVE .ENDC QSVE QSI050: RTS PC ; DONE WITH VOLUNTARY SUSPENSION. ; RETURN TO CALLER. QSI100 =. ; HERE FOR INVOLUNTARY SF .ENDC .IFZ OVRLAY ; NEED THIS CODE ONLY QSVE MOVB R3,@#PS ; FOR ROS 1. ROS 2 USES QSI200. QSVE .ENDC QSVE QSI050: RTS PC ; DONE WITH VOLUNTARY SUSPENSION. ; RETURN TO CALLER. QSI100 =. ; HERE FOR INVOLUNTARY SUSPENSIONS BLT QSI200 ; INVOLUNTARY BUT DON'T RE-QUEUE QSG0 = . MOVB (SP)+,PS ;RELEASE LOCKOUT JSR PC,TOINIT ;INITIALIZE OUTPUT OF A MESSAGE BR TTOR10 ;GO EXIT .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM TTOR70 = . MOVB (SP)+,PS ;RELEASE LOCKOUT BR TTOR10 ;GO EXIT .ENDC .PAGE ; ; TELETYPE INPUT REQUEST PROCESSOR ; ; CALLING SEQUENCE -- ; ; MOV #LIST,-(SP) ;PUIUSPENSIONS BLT QSI200 ; INVOLUNTARY BUT DON'T RE-QUEUE QSVE ; DO OWN REQUEUING HERE ON FRONT OF QUEUE TO SAVE TIME MOVB #2,TSTAT(R4) ; SET STATUS FOR QUEUED QSVE MOVB HPRIOR(R2),R0 ; GET PRIORITY LEVEL TO REQUEUE AT ASL R0 ; MAKE RO AND R4 INTO WORD INDEX QSVE ASL R4 ; DON'T NEED TO RESTORE QSVE MOV FIRST(R0),@HEADER(R4) ; MAKE TASK'S HEADER PJVE ; DO OWN REQUEUING HERE ON FRONT OF QUEUE TO SAVE TIME MOVB #2,TSTAT(R4) ; SET STATUS FOR QUEUED QSVE MOVB HPRIOR(R2),R0 ; GET PRIORITY LEVEL TO REQUEUE AT ASL R0 ; MAKE RO AND R4 INTO WORD INDEX QSVE ASL R4 ; DON'T NEED TO RESTORE QSVE MOV FIRST(R0),@HEADER(R4) ; MAKE TASK'S HEADER POINT TO QSVE ; OLD HEAD OF QUEUE (IF ANY). KSH I/O LIST ADDRESS ON STACK ; EMT TTYIN ;CALL TTYIN ; TTYIN = . JSR R5,PUSHR ;SAVE R0-R5 ON CURRENT STACK JSR PC,REQPP ;CALL REQUEST LIST PREPROCESSOR BNE TTOR20 ;BRANCH ON LIST ERROR MOV #2,R4 ;SET ARG FOR QUEUING OF INPUT LIST JSR PC,QLIST ;NO, QUEUE REQUEST LIST JSR PC,LOCOUT ;LOCKOUT INTERRUPTS TSTB TTI1ST(R1) ;IS THIS 1STMOINT TO QSVE ; OLD HEAD OF QUEUE (IF ANY). QSVE BNE QSI175 ; AVOID NEXT INST. IF NON-EMPTY QSVE ; QUEUE QSVE MOV HEADER(R4),LAST(R0) ; SET LAST POINTER TO HEADER QSVE QSI175 =. ; QSVE MOV HEADER(R4),FIRST(R0) ; SET OR RESET FIRST POINTER QSVE QSI200 =. MOVB N QSVE BNE QSI175 ; AVOID NEXT INST. IF NON-EMPTY QSVE ; QUEUE QSVE MOV HEADER(R4),LAST(R0) ; SET LAST POINTER TO HEADER QSVE QSI175 =. ; QSVE MOV HEADER(R4),FIRST(R0) ; SET OR RESET FIRST POINTER QSVE QSI200 =. MOVB R3,@#PS ; ALLOW INTERRUPTS QS1250: RTS PC ; RETURN TO CALLO INPUT REQUEST FOR UNIT? .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM BGT TTOR70 ;NO, GO EXIT .ENDC .IFZ MSGBUF ;ASSEM FOLLOWING FOR CORE VERSION BGT TTOR05 ;NO, GO EXIT .ENDC ; ; PROCESS 1ST INPUT REQUEST FOR A UNIT ; INCB TTI1ST(R1) ;RESET 1ST REQUEST FLAG MOV R0,ILSTAD(R5) ;SAVE CURRENT INPUT LIST ADDRESS TSTB TTYPRT(R1) ;IS UNIT BUSQ R3,@#PS ; ALLOW INTERRUPTS QS1250: RTS PC ; RETURN TO CALLER QSVE QSI300: MOVB (SP)+,@#PS ; ALLOW INTERRUPTS QSVE MOV (SP)+,(SP) ; RESET STACK FOR RETURN FROM ERROR QSVE MOV (SP)+,(SP) ; QSVE MOV (SP)+,(SP) ; QSVE RTS PC ; RETURN QSVE RER QSVE QSI300: MOVB (SP)+,@#PS ; ALLOW INTERRUPTS QSVE MOV (SP)+,(SP) ; RESET STACK FOR RETURN FROM ERROR QSVE MOV (SP)+,(SP) ; QSVE MOV (SP)+,(SP) ; QSVE RTS PC ; RETURN QSVE .PAGE ;*********************************************************************** SY? .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM BPL TTOR70 ;YES, GO EXIT .ENDC .IFZ MSGBUF ;ASSEM FOLLOWING FOR CORE VERSION BPL TTOR05 ;YES, GO EXIT .ENDC CLRB TTYPRT(R1) ;SET INPUT/OUTPUT PRIORITY TO INPUT BR TTOR60 ;GO INITIALIZE INPUT FOR UNIT .PAGE ; ; ; TTINIT -- TTYIO INITIALIZATION ROUTINE ; ; CALLING SEQUENCE -- U .PAGE ;*********************************************************************** ; * ; S U S P N D * ; * ; PROGRAM IDENTIFICATION: SUSPND * ; * ; PURPOSE: THIS ROUTINE IS USED TO SUSPEND THE CV; * ; S U S P N D * ; * ; PROGRAM IDENTIFICATION: SUSPND * ; * ; PURPOSE: THIS ROUTINE IS USED TO SUSPEND THE CURRENTLY ACTIVE * ; TASK, PRESERVING ITS ENVIRONMENT, AND THEN CALL OW ; ; JSR PC,TTINIT ; TTINIT = . JSR R5,PUSHR ;SAVE REGISTERS MOV #TTICSR,R0 ;CLEAR TTY CONTROL STATUS REGISTERS TTIN10 = . CLR @(R0)+ CMP R0,#TTIDBR BLT TTIN10 MOV #1,R1 .IFG MSGBUF MOV #DRLIST,R0 ;INIT THREAD WORD OF DISC REQUESTS TTIN15 = . MOV R1,@(R0)+ CMP R0,#DWLIST BLT TTIN15 MOVYURRENTLY ACTIVE * ; TASK, PRESERVING ITS ENVIRONMENT, AND THEN CALL ON *SUSP ; THE DISPATCHER TO SCHEDULE THE NEXT TASK (IF AN * ; APPLICATIONS ROUTINE). THE SUSPENSION IS VOLUNTARY * ; AND THEREFORE OF AN INDEFINATE DURATION. * ; * ; USAGE: EMT SUSPND OR CALL SUSPND * ; ZN *SUSP ; THE DISPATCHER TO SCHEDULE THE NEXT TASK (IF AN * ; APPLICATIONS ROUTINE). THE SUSPENSION IS VOLUNTARY * ; AND THEREFORE OF AN INDEFINATE DURATION. * ; * ; USAGE: EMT SUSPND OR CALL SUSPND * ; * ; NOTE: THIS ROUTINE SWITCHES THE CURRE[ R1,DWLIST .ENDC MOV R1,ERRMOD ;INIT THREAD WORD OF ERROR MODULE MOV #ITIME0,R0 ;INIT THREAD WORD OF TIMERS TTIN20 = . MOV R1,(R0) ADD #ITIMSZ,R0 CMP R0,#ITIMFB BLT TTIN20 MOV #TTYPRT,R0 ;CLEAR BLOCK OF VARIABLES TTIN25 = . CLRB (R0)+ CMP R0,#QLAST BLT TTIN25 MOV #TTYPRT,R0 ;SET UNIT STATUS FLAGS TO NOT BUSY ] * ; NOTE: THIS ROUTINE SWITCHES THE CURRENT STACK POINTER * ; FROM THE TASK STACK TO THE SYSTEM STACK. * ; * ; PROGRAMMER: 53 * ; DATE: 25 AUG 71 * ; REVISION: 0 * ; CATALOGUE NUMBER: ^NT STACK POINTER * ; FROM THE TASK STACK TO THE SYSTEM STACK. * ; * ; PROGRAMMER: 53 * ; DATE: 25 AUG 71 * ; REVISION: 0 * ; CATALOGUE NUMBER: * ; _ MOV #-1,R2 TTIN30 = . MOVB R2,(R0)+ CMP R0,#TTO1ST BLT TTIN30 TTIN35 = . CLRB (R0)+ ;SET FIRST REQUEST FLAGS CMP R0,#TTORPT BLT TTIN35 MOV #TTYON,R0 ;SET TTY ON/OFF FLAG TO OFF TTIN40 = . MOVB R1,(R0)+ .IFZ MSGBUF CMP R0,#OLSTAD .ENDC .IFG MSGBUF CMP R0,#NXTSEC .ENDC BLT TTIa * ; * ;*********************************************************************** .PAGE .DEF SUSPND .REF STACK ; SUSP ; SUSPND =. ; ENTRY POINT MOVB @#PS,-(SP) ; PUT PS ON SATCK FOR QSAVE CALL SUSP CLR -(SP) ; SET ARGUMENT FOR RETURN SUb * ;*********************************************************************** .PAGE .DEF SUSPND .REF STACK ; SUSP ; SUSPND =. ; ENTRY POINT MOVB @#PS,-(SP) ; PUT PS ON SATCK FOR QSAVE CALL SUSP CLR -(SP) ; SET ARGUMENT FOR RETURN SUSP ; ; THE TASK STACK NOW LOOKS AS FOLLOWS FOR THE CALL TO QSAVE: SUSP cN40 .IFG MSGBUF MOV #DAVAIL,R0 ;SET DISC FILE AVAIL FLAGS TO AVAIL TTIN50 = . MOVB R1,(R0)+ CMP R0,#DBFULL BLT TTIN50 .ENDC MOV #QLAST,R0 ;SET QLAST TO QFIRST MOV #QFIRST,R1 TTIN60 = . MOV R1,(R0)+ TST (R1)+ CMP R1,#QLAST BLT TTIN60 JSR R5,POPR ;RESTORE REGISTERS RTS PC ;RETURN eSP ; ; THE TASK STACK NOW LOOKS AS FOLLOWS FOR THE CALL TO QSAVE: SUSP ; PC SUSP ; PS SUSP ; ARG (=0) <== SP ; ; THE TOP OF THE SYSTEM CONTAINS THE RETURN ADDRESS TO USE ; IF THE CALL IS FROM A SYSTEM ROUTINE. ; JSR PC,QSAVE ; CALL ON QSAVE TO PRESERVE ENVIRONMENT JMP DSPTCH ; f; PC SUSP ; PS SUSP ; ARG (=0) <== SP ; ; THE TOP OF THE SYSTEM CONTAINS THE RETURN ADDRESS TO USE ; IF THE CALL IS FROM A SYSTEM ROUTINE. ; JSR PC,QSAVE ; CALL ON QSAVE TO PRESERVE ENVIRONMENT JMP DSPTCH ; GO TO DISPATCHER TO GET NEXT TASK. .PAGE ;*********************************g .PAGE ; ; ; PRTINT -- TTY PRINTER INTERRUPT ROUTINE ; ; CONDITIONS UPON ENTRY -- ; ; TTY UNIT NO. IS CONTAINED IN BITS 0-3 OF PS ; AS PROVIDED BY INTERRUPT VECTOR FOR ; INTERRUPTING UNIT ; ; ROUTINE IS ENTERED AT PRIORITY LEVEL OF UNIT VECTOR ; ; PRTINT = . SAVE ;CALL SAVE ROUTINE MOVB PS,R1 ;GET PS PROVIDED BY INT VECTOR BIC #177760,R1 ;UNiGO TO DISPATCHER TO GET NEXT TASK. .PAGE ;*********************************************************************** ; * ; E X I T * ; * ; PROGRAM IDENTIFICATION: EXIT * ; * ; PURPOSj************************************** ; * ; E X I T * ; * ; PROGRAM IDENTIFICATION: EXIT * ; * ; PURPOSE: THIS ROUTINE IS USED TO TERMINATE THE CURRENTLY ACTIVE* ; TASK. ANYkIT NO. IS IN BITS 0-3 OF PS MOV R1,R5 ;USE UNIT NO. AS INDEX TO ASL R5 ;WORD TABLES JSR PC,LOCOUT ;LOCKOUT INTERRUPTS TSTB TOFLAG(R1) ;HAS TIMEOUT ALREADY OCCURRED? BNE PRTA05 ;YES, IGNORE THIS INTERRUPT MOV OTIMER(R5),R4 ;GET ADDRESS OF TIMER FOR THIS UNIT MOVB #TTOTIM,TCNTR(R4) ;PUT COUNT INTO TIMER MOVB (SP)+,PS ;RELEASE LOCKOUT MOVB #NTRYSmE: THIS ROUTINE IS USED TO TERMINATE THE CURRENTLY ACTIVE* ; TASK. ANY IIO IN PROGRESS WILL BE IGNORED. THE TASK * ; STATUS, ACTIVE, AND CURRENT TIMER VALUE ARE ALL SET * ; TO ZERO, AS IS MFLAG. THE TASK'S THREAD WORD IS *EXIT ; SET TO ONE TO PERMIT REQUEUING. *EXIT ; * ; USAGE: EMT EXIT OR CALL EXIT *n IIO IN PROGRESS WILL BE IGNORED. THE TASK * ; STATUS, ACTIVE, AND CURRENT TIMER VALUE ARE ALL SET * ; TO ZERO, AS IS MFLAG. THE TASK'S THREAD WORD IS *EXIT ; SET TO ONE TO PERMIT REQUEUING. *EXIT ; * ; USAGE: EMT EXIT OR CALL EXIT * ; * ; o,TTORPT(R1) ;SET REPEAT COUNT TO NO. OF TRYS MOVB CHTYPE(R1),R4 ;GET CHARACTER TYPE ASL R4 ;MAKE INDEX FOR BRANCH TABLE = 2*CHTYPE JMP @PRTA10(R4) ;BRANCH ON CHAR TYPE PRTA05 = . CLRB TOFLAG(R1) ;CLEAR TIMEOUT FLAG JMP PRTA93 ;GO RETURN ; ; ; BRANCH ON CONTENTS OF CHTYPE ; PRTA10 = . .WORD PRTA15 ;INTERRUPT FROM CHAR OF OUTPUT MSG .WORD PRTB10 ;q ; * ; NOTE: THIS ROUTINE SWITHES TO THE SYSTEM STACK AND * ; PASSES CONTROL TO THE DISPATCHER. * ; * ; PROGRAMMER: 53 * ; DATE: 30 AUG 71 * ; REVISION: 0 sECHO OF INPUT CHAR .WORD PRTB30 ;ECHO OF LF .WORD PRTB40 ;ECHO OF CR .WORD PRTB50 ;ECHO OF "U" .WORD PRTB60 ;ECHO OF "^" .WORD PRTB80 ;ECHO OF 1ST "^" .WORD PRTB90 ;ECHO OF "\" .WORD PRTC10 ;ECHO OF EOM CHAR .WORD PRTC20 ;INT FROM OUTPUT OF LF .WORD PRTC30 ;INT FROM OUTPUT OF CR .WORD PRTC40 ;ECHO OF CR AFTERu * ; CATALOGUE NUMBER: * ; * ;*********************************************************************** .PAGE .DEF EXIT .REF COUNTR,MFLAG ; EXIT .IFNZ OVRLAY ; EXIT .REF QOVNXT ; EXIT CTDA w EOM .WORD PRTC50 ;ECHO OF LF AFTER EOM,CR .WORD PRTC60 ;INT FROM OUTPUT OF RUBOUT TO TURNON TTY ; ; ; PROCESS INTERRUPT FROM CHAR OF OUTPUT MSG ; PRTA15 = . INCB TTCURS(R1) ;INCREMENT CURSOR CMPB TTCURS(R1),#LINELN ;END OF LINE? BGE PRTA30 ;YES PRTA17 = . MOV OLSTAD(R5),R0 ;NO, GET CURRENT LIST ADDRESS .IFG MSGBUF BIT #000001,R0 ;IS DATA IN WORKy .ENDC EXIT ; EXIT =. ; ENTRY POINT MOVB #340,@#PS ; LOCK OUT ALL INTERRUPTS MOV ACTIVE,R0 ; GET ADDRESS OF PROGRAM HEADER CLR R1 ; CLEAR R1 FOR BYTE LOAD EXIT BISB TASKNO(R0),R1 ; GET TASK NUMBER FORM TASK HEADER EXIT MOV #1,(R0) ; PUT A 1 IN THE THREAD WORD (QUEUABLE) EXIT CLRB TSTAT(R1) ; ND.E PLQI ; PC S RT PLQI C ND.E PLQI ; 30PLQI T BG PLQI E.BLTAC MINADY E.ON DNE OCHEAT UNCO; R0 C DE PLQI ; 1)(R,+#1 V MO: 30PLQI PLQI . 1TO; {ING OUTPUT BUFFER? BEQ PRTA20 ;NO, DATA IS IN USERS BUFFER DEC R0 ;STRIP OFF LSB MOV R0,R4 ;TO GET LIST ADDRESS ADD #DATA,R4 ;SET POINTER TO MSG DATA IN OUTPUT BUF BR PRTA25 .ENDC PRTA20 = . MOV DATA(R0),R4 ;SET POINTER TO MSG DATA IN USERS BUF PRTA25 = . INC CHCNT(R4) ;INCR CHAR COUNT CMP CHCNT(R4),(R4) ;HAVE ALL CHAR BEEN OUTP} ; SET TASK STATUS TO INACTIVE (=0) CLR ACTIVE ; REMOVE ACTIVE TASK'S ADDRESS CLR COUNTR ; CLEAR CURRENT TIMER VALUE CLR MFLAG ; REMOVE ALL SOFTWARE LOCK OUTS, IF ANY. CLR TSTACK(R0) ; CLEAR STACK POINTER FOR DISPATCHER EXIT MOV STACK,SP ; RETURN TO SYSTEM STACK EXIT .IFNZ OVRLAY ; EXIT CMPB R1,#OVTMIN ; R1B,TABM#A V MO PLQI ETES RBEO TEDNES RDWOD EAHR TERFFBU; R0S,MEAB#$ V MO PLQI O I/E AGESMET ORABF ILYONE OD CISTH; ESBM$A FG.I PLQI MECOO TREMO; 20PLQI T BG PLQI E ONY BERNTOI PTEBYT ENEMCRDE; R0 C DE PLQI ERNTOU CRDWOE TH2 Y BETEMCRDE; ) R1-( T TS PLQI C ND.E PLQI UT? BGE PRTA40 ;YES ADD CHCNT(R4),R4 ;ADD CHAR COUNT TO POINTER MOVB MSGDAT(R4),@TTODBR(R5) ;OUTPUT NEXT CHAR CMPB MSGDAT(R4),#CR ;IS CHAR A CR? BEQ PRTA35 ;YES BR PRTA85 ;NO, GO RETURN PRTA30 = . MOVB #CR,@TTODBR(R5) ;OUTPUT A CR PRTA35 = . MOVB #10.,CHTYPE(R1) ;SET CHAR TYPE TO OUTPUT MODE CR BR PRTA85 ; ; DO POST PROCESSING FIS THIS AN OVERLAY TASK? EXIT BLO EXIT00 ; NO. RETURN. EXIT INCB TSTAT(R1) ; YES. SET RPOM'S STATUS, EXIT CLRB @#PS ; ALLOW INTERRUPTS EXIT MOV R1,-(SP) ; PUT TASK NO. ON STACK FOR QOVNXT JSR PC,QOVNXT ; CALL ON RPOM FOR OVERLAY ASSIGN. EXIT00: .ENDC CLRB @#PS ; ALLOW INTERRUPTS EXIT ; ) R1D(IF R CL PLQI ; ) R0E(IZBS RBCL PLQI ; AYRLOV Z FN.I PLQI ; ) R0Y(RTTP RBCL PLQI ; 0)(RATSTIO RBCL PLQI T)ULFADE (EDBLSADIO TUSATSTT SE; 0)(RATST,T#6 VBMO PLQI ESBLTAK AS TZELIAAITIN; 1)(ROR A REQUEST ; PRTA40 = . MOV OTIMER(R5),-(SP) ;DEQUEUE TIMER MODULE FOR THIS UNIT JSR PC,DQTIME TST (SP)+ CLRB @TTICSR(R5) ;DISABLE KBD INTERRUPT CLRB @TTOCSR(R5) ;DISABLE PRT INTERRUPT MOV ERROR(R0),R3 ;ANY ERROR FLAGS IN ERROR WORD? BEQ PRTA41 ;NO MOVB ERRTSK(R0),R4 ;IS THERE AN ERROR TASK IN LIST? BEQ PRTA41 ;NO MOV R4,-(SP)  JMP DSPTCH ; CALL ON THE DISPATCHER TO SCHEDULE ; NEXT TASK .PAGE ;*********************************************************************** ; A B O R T * ; * ; PROGRAM IDENTIFICATION: ABORT * ; * ; PUERADHE R CL: 20PLQI PLQI ; 1 ,RAXSMTAX+MAAS#T V MO PLQI S LEAB TSKTAP UET STOY ADRET GE; R0X,MAAS#T V MO PLQI ET YGOO TREMO; 10PLQI T BG PLQI RDWOT EX NEXND ITO2 Y BR0T ENEMCRDE; 0 ,R#2 B SU PLQI ; ) R0T(AS,LR0 D AD PLQI STLAN ISTIR FOFS ESDRADE ACPL; ) R0T(AS,LSTIR#F V MO PLQI  ;PUSH ERROR TASK NO. ON STACK .IFG DPRTY CLR -(SP) ;PUSH IPRTY ONTO STACK .ENDC .IFG ARG MOV R3,-(SP) ;PUSH ERROR CODE ONTO STACK .ENDC CLR -(SP) ;PUSH IRTRN ONTO STACK JSR PC,QUEUE ;QUEUE ERROR TASK TST (SP)+ ;POP ERROR CODE OFF STACK PRTA41 = . MOVB LEVEL(R0),R2 ;GET LEVEL MOV #2,R4 ;SET REGISTER FORRPOSE: TERMINATE THE EXECUTION OF A TASK, PRINT AN ERROR * ; MESSAGE, AND PLACE THE TASK STATUS IN THE ABORT * ; CONDITION. * ; * ; USAGE: THE USAGE OF THIS ROUTINE IS EITHER: * ; * ; 1). MOV ATASK,-(SP) (ASSEMBLY) * ; ROZEO TSTIR FZELIIAITIN; ) R0T(RSFI R CL: 10PLQI PLQI EXND IRDWOO NT IKEMA; R0 L AS PLQI S ELEV LTYRIIOPRF OERMBNUT GE; 0 ,RLSVELE V MO PLQI ; NASYSB R CL PLQI ; VETIAC R CL PLQI ; ORRI$P R CL PLQI S LEABRIVAR EACL; SKTA$C~ INPUT DEQUEUING TSTB TTYPRT(R1) ;DID UNIT JUST FINISH INPUT? BEQ PRTA42 ;YES .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM BIT #000001,OLSTAD(R5) ;WAS DATA IN WORKING BUFFER? BNE PRTA43 ;YES, DEQUEUING NOT REQUIRED .ENDC CLR R4 ;NO, SET REGISTER FOR OUTPUT DEQUEUING PRTA42 = . JSR PC,DQLIST ;DEQUEUE LIST JUST PROCESSED PRTA43 = . D EN . C ND.E N URET;R PC S RT R1+,P)(S V MO RSTEISEG RRETOES EMT ABORT * ; * ; * ; 2). CALL ABORT(ATASK) (FORTRAN) * ; * ; WHERE * ; ATASK IS THE NUMBER OF THE TASK TO BE ABORTED. R CL PLQI T INPOY TREN; =. PLQI PLQI ; PLQI EF.D PLQI E AG.P PLQI**********************************************************************;* PLQI * ; PLQI * : ERMBNUE GULOTACA ; PLQI * z CMPB TYPE(R0),#2 ;BRANCH ON EXIT TYPE BGT PRTA44 ; TYPE 3 BLT PRTA47 ; TYPE 1 CLR -(SP) ; TYPE 2, PUT SUSPENDED TASK NO. IN MOVB SYSTEM(R0),(SP) ; LOWER BYTE OF STACK WORD CLR -(SP) ;PUSH IRTRN ONTO STACK (RETURN TO CALLR) JSR PC,UNSPND ;CALL UNSUSPEND TST (SP)+ ;POP ERROR CODE OFF STACK BR PRTA47 PRTA44 = . JSR;R R4+,P)(S V MO F OFO TUSATSTT NI UET;S ) R1N(YOTT CBIN R1 R AS ESBLTAD OR WTOX DEINT NI UET;G R1 L AS E YT BAGFLR METIM RO FNOT NI UET;G 1 ,RFBIMWT VBMO P)(S,-R4 V MO S ERSTGIREE AV;S P)(S,-R1 V MO . = ONYOTT ; ; EDEUQUDES IERIM TITWA ; FF OTOT SES IG)LA FFF/OONT NI(UN YOTT ; ; - -ITEXN PO UNSIOITNDCO ; ; E YT BAGFLR METIx * ; * ; SYSGEN: THE SYSGEN PARAMETER '$ABMES' IS USED BY ABORT TO * ; DETERMINE HOW MANY ABORT MESSAGES CAN BE PENDING AT * ; A GIVEN TIME. IF A TASK IS ABORTED AND NO MESSAGE * ; BUFFER IS AVAILABLE, THE TASK WILL STILL BE ABORTED * ; BUT NO MESSAGE WILL PRINTED. * ; : ONSIVIRE ; PLQI * 1 97 1OV N10 : TEDA ; PLQI $ 53: ERMMRAOGPR ; PLQI * ; PLQI * L IP,QPC SR J E:AGUS ; PLQI * ; PLQI * . PL IBYD LEAL C. ESINOU RNGUIUE Q v R5,PUSHR ;SAVE REGISTERS .IFG MSGBUF MOV R1,R4 ;MOVE UNIT NO. TO TEMP REG .ENDC MOV R0,R1 ;GET ASSUMED LIST ADDRESS .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUG SYSTEM TSTB TTYPRT(R4) ;IS INPUT BEING PROCESSED? BEQ PRTA45 ;YES ASL R4 ;SET INDEX TO 2*UNIT BIT #000001,OLSTAD(R4) ;NO, OUTPUT. IS LIST IN WORKING BUF? BEQ T AI WIND NEAINTCOS IO. NITUN ; ; --Y TRENN PO UNSIOITNDCO ; ; N OOTY,TPC R JS ; ; - -CEENQUSEG INLLCA ; ; NETIOU RUTEOIM TERIM TITWAY TT- -ONYOTT ; ; ; E AG.P RNTURE ; C P TS R 7 L VELEY ITORRI PTOU CPT SE ; PS0,34 # B IS B S ESDRADN URET RVEBO APST ERNS;I P)(S,2PS VBMO RDWOE ONN OW DSSREDD ARNTUREH US;P P)(S,-P)(S V MO . =T OUOC L; UTCOLOt * ; * ; * ; REGISTERS: ABORT USES REGISTERS R0 AND R1. THE WILL BE SAVED IF* ; THE SYSGEN PARAMETER 'RGSAVE' IS NON-ZERO. * ; * ; PROGRAMMER: 53 * ; DATE: 20-SEP-71 ; PLQI * HE TINS LEAB TND AESBLIAAR VLL AOFN IOATIZALTINI IE:OSRPPU ; PLQI * ; PLQIE*EUQUR FOE INUTRON IOATIZALTINI I -PLQI: ONTICAFITIENIDM RAOGPR ; PLQI * ; PLQI * L P I Q ; PLQI * ; PLQI**************************r PRTA45 ;NO MOV (R0),R1 ;YES, ORIG LIST ADDRESS IS IN THREAD WRD .ENDC PRTA45 = . JSR PC,@EXIT(R0) ;CALL I/O COMPLETION ROUTINE ;WITH LIST ADDR IN R1 JSR R5,POPR MOVB SYSTEM(R0),R4 ;WAS REQUEST MADE BY TASK? BEQ PRTA47 ;NO, BY SYSTEM DECB IOSTAT(R4) ;YES, DECR TASK I/O STATUS IN TASK TABLE ; ; SEARCH QUEUES FOR NEXT REQUEST TO BE PRC, P SR J ;; --E NCUEEQ SNGLIAL C ;; 7)O TRI PPU CTSSE (TSUPRRTEINT OUCKLOO TNETIOUBRSU- -UTCOLO ; ;; GEPA . C ND.E 47TAPR P JM VESA ) SP-(6,R5TD#T V MO NETIOU;R T UPRRTEINR TEINPRO TCEANTRENE AK;M P)(S,-PS VBMO ESBLTAD OR WTOX DEINT NI UASD SE U; R5 L AS ITUN2*= X DEINT GE ; R51, R OV M . NOT NI UET;G R1p * ; REVISION: 0 * ; CATALOGUE NUMBER: * ; * ;*********************************************************************** .PAGE .DEF ABORT .REF MFLAG ; ABRT .IFG $ABMES ; ONLY NEED IF WE HAVE ABORT MESSAGES AB********************************************;* E AG.P E NUTION C ATHWIY WA AET GITT LET N'DO; RRPEDS BR ; LTHA: RRPEDS ; G.INTHD BAY ER V A -ORRR EOR FREHE; ; PC& S PTHBOS ET STI R. SKTAO TRNTURE; I RT ; R5+,P)(S V MO ; R4+,P)(S V MO ; R3+,P)(S V MO ; R2+,P)(S V MO ; R1+,P)(S V MO N IOCTRUSTIN1 RT);SP.(12),R1T(USCP nOCESSED ; PRTA47 = . CLR R4 ;SET Q POINTER FOR PRIORITY OUTPUT MOV #1,R2 JSR PC,GETQX CLRB TTYPRT(R1) ;SET UNIT STATUS FLAG TO INPUT JSR PC,LOCOUT ;LOCKOUT INTERRUPTS .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM PRTA49 = . MOV R5,R3 ;SET UNIT LEVEL INDEX TO PRIORITY INC R3 TSTB DAVAIL(R3) ;IS PRIORITY DISC FILE FOR UNIT R AS LEABILVANA ULEFIT SE ; ) R1L(AIAV D B LR C L VELE+ T NI*U 2= X DEINT GE ; 1 R SR A D REURCC OCHAT MREHE WEXND ILEAB TET GS,YE ; 1 ,R+2IDLEFI # UB S O ;N 70DRTT E BN E?BLTAD ILEFIN IRYNT ECHAT MMENAS OE;D )+R1,(R3 P CM . =0 R7TD TR TEINPOE BLTAD EIIL FITIN ; 1 ,RIDLEFI # OV M R FEUF BADREM RO FIDE IL FET;G R3),R1A(AT@D V MO . =0 R6TD T; TYRIIOPRT/NI UOR F QRECOlRT .REF LERTYP ; ABRT .ENDC ABRT .IFNZ OVRLAY ; ABRT .REF DQOVLY ; ABRT .ENDC ABRT ; ; ON ENTRY THE STACK LOOKS THIS WAY: ; ; TASK NUMBER ; PC <=== STACK P VBMO OR FPCD OL HTOK ACSTF OOMTTBOE US; ) SP.(12 R CL RSTEISEG RORSTRE; R0),SP.(12 V MO ERNTOI PCKTA SSKTAT SE; P ,S1)(RCKTATS V MO K AS TOR FERIM TET S ;R NTOU,C1)(RERIMCT V MO ; =. 10PRDS ; NTMEONIRNV ERETOES R -SKTAD DEENSPSUG INRTTAES ROR FREHE; ; PTDS . SKTAW NEE THO TGO; I RT PTDS I RTR FOK ACSTN OUEAL VPCT PU; ) SP-(),R1Y(TREN V MO j AVAIL? BEQ PRTA50 ;NO, GO CHECK PRIORITY OUTPUT CORE Q CMPB NXTMSG(R3),NXTSEC(R3) ;ANY MESSAGES IN PRIORITY FILE? BNE PRTA95 ;YES, GO READ DISC TSTB DBFULL(R3) ;MAYBE, IS DISC FILE FULL? BGT PRTA95 ;YES, GO READ DISC BR PRTA55 ;NO, GO CHECK FOR PRIORITY INPUT .ENDC PRTA50 = . MOV QFIRST(R4),R0 ;ANYTHING IN PRIORITY OUTPUT Q? BGT PRTA65 O TRTVEON CR,ROERD EA RSCDI ; ;0 R5TD T R B T OUCKLOE ASLERE ; S ,P)+SP ( B OV M . =8 R5TD TN URET;R PC S RT RSTEISEG RRETOES;R R OP,PR5 R JS . = 56DRTT UTTPOUR OUTNP IZELIIAITIN ; ITINTOC, P SR J . = 50DRTT UTKOOC LSEEAEL;R PS+,P)(S VBMO D OR WADRETHO ER;Z 3)(R C DE SCDIN OUT PSTJUT IS LUEUEEQ;D T ISQL,DPC R JS S PTRUERNT IUTKOhOINTER ; ABORT =. ; ENTRY POINT ASAVE =0 ; DEFAULT NUMBER OF REGISTERS SAVED .IFNZ RGSAVE ; ASAVE =4 ; MOV R0,-(SP) ; SAVE R0 MOV R1,-(SP) ; SAVE R1 .IFG $ABMES ; ONLY NEED IF WE HAVE ABORT MESSAGES ABRT ASAVE =6 ; ABORT MESSAGES USE AN ADDITIONAL REG ABRT MOV R2,-(SP) ; SAVE R2 (ONLY FOR ABORT MESSAG PTDS I RTR FOK ACSTN O0) (UEAL VPST PU; ) SP-( R CL ERIM TSKTAT SE; R NTOU,C1)(RXTMA V MO . EAARK ACSTE THF OGEEDW LO; E THO TERADHEE THM RO FETFSOFE TH; PTDS D AN, EAARK ACSTE THF OZESIE TH; P ,SSVEG#R D AD PTDS SSREDD AERADHEM RAOGPR; P ,SR1 D AD PTDS ) ESYT BTOT IFSH ( ; SP L AS PTDS f ;YES PRTA55 = . CMP (R4)+,(R4)+ ;NO, SET Q POINTER FOR PRIORITY INPUT MOV QFIRST(R4),R0 ;ANYTHING IN PRIORITY INPUT Q? BGT PRTA75 ;YES .IFG MSGBUF ;ASSEM FOLLOWING FOR MSG BUF SYSTEM DEC R3 ;SET UNIT/LEVEL INDEX TO NORMAL TSTB DAVAIL(R3) ;IS NORMAL DISC FILE FOR UNIT AVAIL? BEQ PRTA60 ;NO, GO CHECK NORMAL OUTPUT CORE Q CMPB NXTMSG(R3),NXTSOC;L T OUOC,LPC R JS G REP EM TINR DD ASTLIE AV;S 3 ,RR0 V MO STLIDQT PUUT OOR FEG RET;S R4 R CL . = 40DRTT O ;N 50DRTT E BN ? NGNIAR WZESIG MSA R ROERS ;I SZRMER,#R3 P CM O ;N 40DRTT Q BE R?ROERT ESQUREC IS D AREHE TAS;W R3),R0R(ROER V MO NETIOU RTERI WSCDIL AL;C T CWIS,DPC R JS REHEM RO FMECAL AL CTERI WSCDI ; T dES) ABRT .ENDC ABRT .ENDC ATASK =ASAVE+2 ; STACK INDEX TO GET TASK NUMBER CLR R0 ; CLEAR R0 FOR BYTE LOAD ABRT BISB ATASK(SP),R0 ; GET NUMBER OF TASK TO ABORT ABRT BEQ ABRE10 ; TASK #=0 IS ILLEGAL ABRT CMPB R0,TASKS ; IS TASK#> LARGEST LEGAL TASK NUMBER ABRT BHI ABRE10 E THG INDD ABYR TEINPO; P ,S1)(RZESI VBMO PTDS K ACSTL IAITINE UTMPCO; SP R CL ; =. 10PNDS ; K AS TEW NOR FREHE; ; . ITO DGO D.DEENSPSUS WA; 10PRDS E BN O ERNZNO; EW=NROZE. ERNTOI PCKTA SSTTE; 1)(RCKTATS T TS PTDS R TEINPOK ACSTM TEYS SVESA; CKTA,SSP V MO PTDS . ORRI$PT SE; R IOPR,$R2 VBMO PTDS bEC(R3) ;ANY MESSAGES IN NORMAL FILE? BNE PRTA95 ;YES, GO READ DISC TSTB DBFULL(R3) ;MAYBE, IS DISC FILE FULL? BGT PRTA95 ;YES, GO READ DISC SUB #6,R4 ;ADJUST Q POINTER BR PRTA70 ;GO CHECK FOR NORMAL INPUT .ENDC PRTA60 = . SUB #6,R4 ;SET Q POINTER TO NORMAL OUTPUT MOV QFIRST(R4),R0 ;ANYTHING IN NORMAL OUTPUT Q? BEQ PRTA70 OUCKLOE ASLERE ; S ,P)+SP ( B OV M NO ; 8 R5TD T NE B E BLDAEAHR TSTLIO I/C IS DIS ; #1T,ISWL D MP C U LIDW CBIN E EUQUE OR CINT ESQUREE AVLE, ES;Y 58DRTT T BG E?USN ISTLIO I/E ITWRC IS DIS ; IUWL D B ST T S PTRUERNT IUTKOOC;L T OUOC,LPC R JS 3 ,RR2 D AD S LEAB TLEFIC IS DTOX DEINE AK;M 3 ,RR5 V MO . = 30DRTT ALRMNOO TELEV LET;S R2 R ` ; MOVB @#PS,-(SP) ; SAVE PS MOVB #340,@#PS ; LOCKOUT ALL INTERRUPTS MOVB TSTAT(R0),R1 ; GET TASK STATUS ASL R1 ; MAKE INTO WORD INDEX ABRT JMP @ABTAB(R1) ; JUMP VIA STATUS. ; THE TABLE 'ABTAB' REQUIRES ONE ENTRY PER STATUS. IT IS USED AS A JUMP ; TABLE WITH THE ENTRIES BEING THE ADDRESSES TO HANDLE THE DIFFERENT ; TYPES OF ABORTS. THE INDEX INTO THE TABLE IS THE TASK STATUS. ABTA ELEV LTYRIIOPRE RU TTOINT IFSH; R2 R AS PTDS VETIACO TUSATSTT SE; ) R5T(TATS CBIN PTDS SKTA$CT SE; K ASCT,$R5 VBMO: 30PLDS PTDS L.VELES HI TINY TRENT EX NCKHE CGO; 25PADS BR PTDS D ANS PTRUERNT IOWLL A. EDEUQUT NO; PS@# RBCL PTDS T. IDOO G. EDEUQUS IT; 30PLDS Q BE PTDS USATSTK ECCH; ^ ;NO, GO CHECK FOR NORMAL INPUT PRTA65 = . MOVB (SP)+,PS ;RELEASE LOCKOUT INCB TTYPRT(R1) ;SET UNIT PRIORITY TO OUTPUT MOV R0,OLSTAD(R5) ;SAVE CURRENT OUTPUT LIST ADDRESS BR PRTA80 ;GO INIT OUTPUT PRTA70 = . CLRB TTO1ST(R1) ;CLEAR 1ST OUTPUT REQUEST FLAG CMP (R4)+,(R4)+ ;SET Q POINTER TO NORMAL INPUT MOV QFIRST(R4),R0 ;ANYTHING IN NORMAL INPUT Q? BEQ CL O ;N 50DRTT Q BE QUTTPOUL MAOR NING INTHNY;A 0 ,R4)(RSTIRQF V MO T PUUT OALRMNOO TERNTOI P QET;S ) R4-( T TS ES;Y 30DRTT E BN UEUE QISTHN INGTIAI WTSESQUREY AN ; R0),R4T(RSFI Q OV M 4 RTOR TEINPOE BLTAQ T GE ; X TQGEC, P SR J Y ITORRI PTOL VELET SE ; R21, # OV M S UEUE QUTTPOUR FOG LA FET;S R4 R CL AGFLL UL FLEFIR FEUF BSCDIR EACL ; ) R3L(ULBF\B: .WORD ABRFIN ; STATUS=0. RETURN - NO ACTION. ABRT .WORD ABRD10 ; 1. TELL RPOM AND SET STATUS=7. ABRT .WORD ABRA10 ; 2. DQUEUE AND SET STATUS=7. ABRT .WORD ABRC10 ; 3. SHUT DOWN AND SET STATUS=7. ABRT .WORD ABRD10 ; 4. SET STATUS=7. ABRT .WORD ABRD10 ; 5. SET STATUS=7. ABRT .WORD ABRFIN ; 6. RE#2),R5T(TATS PBCM PTDS R.BEUM NSKTAT GE; 5 ,R1)(RNOSKTA SBBI PTDS . ADLOE YT BOR FR5R EACL; R5 R CL PTDS E.OND UNFO; =. 20PLDS PTDS STIR FTO; ) R2T(AS,LSTIR#F D AD PTDS T INPOO TSTLAT SERE T.EF LNENO; ) R2T(AS,LR2 V MO . TSISEXR HEOTANE UR SKEMA E.EUQU; 20PLDS E BN N IXTNEO TNTOI PTOZ PRTA90 ;NO PRTA75 = . MOVB (SP)+,PS ;RELEASE LOCKOUT MOV R0,ILSTAD(R5) ;SAVE CURRENT INPUT LIST ADDRESS PRTA80 = . JSR PC,TOINIT ;INIT NEXT INPUT OR OUTPUT FOR UNIT PRTA85 = . JMP RESTOR ;RESTORE REGS. & RETURN FROM INTERRUPT PRTA90 = . CLRB TTI1ST(R1) ;CLEAR 1ST INPUT REQUEST FLAG DECB TTYPRT(R1) ;SET UNIT TO NOT BUSY PRTA93 = . M D B LR C . = 20DRTT LEFIF OORCTSET 1SO TERNTOI PET;S 3)(RSGTMNX RBCL . =0 R1TD T0 R2TD T R B ) R3G(MSXT,NR4 VBMO R4Z,FSBU#D D AD ZESIG MSE ONY BERNTOI PMPBU, NO ; R4),R3G(MSXT N B OV M S YE ; 0 R1TD T GE B ? EDUS ; N EE BLEFIF OORCTSEP TOS HA ; 1 Z-ESIL#F),R3G(MSXT N B MP C T SEB LS ; 5)(RADSTOL0, R OV M H IT WSSREDD ASTLIT PUUT ONTREUR CVESAXTURN - NO ACTION. ABRT .WORD ABRFIN ; 7. RETURN - NO ACTION. ABRT .WORD ABRFIN ; 8. RETURN - NO ACTION. ABRT ; ABRT ABRA10 =. ; DEQUEUE MOVB (SP),@#PS ; ALLOW INTERRUPTS ABRT MOV R0,-(SP) ; PUT TASK NO. ON STACK JSR PC,FRETSK ; USE FRETSK TO DEQUEUE THE TASKT RSFIV MO; 2)(RSTIR,F2)(RSTIR@F V MO VETIACT SE; E IVCT,AR1 V MO R DEEA HOFS ESDRADT GE; R1),R2T(RSFI V MO PTDS H.RCEA SRTTAES RGO S.YE; CHPTDS E BN PTDS T?SEG LA FHE TIS; NASYSB T TS PTDS S PTRUERNT ILL AUT OCKLO; S #P,@40#3 VBMO ; =. 10PLDS ; SKTAD UEUE Q AADLOO TREHE; ; PTDS . CHARSEE EUQUA G INSHNIFI; VOVB (SP)+,PS ;RELEASE LOCKOUT BR PRTA85 ;GO RETURN .IFG MSGBUF PRTA95 = . MOVB (SP)+,PS ;RELEASE LOCKOUT INCB TTYPRT(R1) ;SET UNIT STATUS FLAG TO OUTPUT MOV TTOBUF(R5),R4 ;GET OUTPUT BUFFER ADDRESS FOR UNIT MOV DRLIST(R5),R0 ;GET DISC READ I/0 LIST ADDR FOR UNIT ASL R3 ;ADJUST INDEX FOR WORD TABLE USAGE MOV FILEID(R3),(R4) ;PUT FILE ID INTO BUFFER ; 0 R NC I 3 ,RR2 D AD ITUN2* =R5 ; S LEAB TITUND OR WTOX DEINE AK;M 5 ,RR3 V MO L)VELE+ T NI*U(2= 3 R; R3 L AS LEAB TLEFIC IS DTOX DEINE AK;M 3 ,RR1 V MO ELEV LET;G R2),R0L(VELE VBMO . NOT NI UET;G1 ,R0)(R+1EMSTSY VBMO S ESDRADT IS LET;G R0T,LSTR#T D AD SSREDD AERFFBUA AT DUTTPOUT GE ; R0),R1A(AT D OV M S YE ; T ABRT TST (SP)+ ; CHECK RETURNED STATUS BNE ABRFIN ; NOT DEQUEUED. CAN'T ABORT. RETURN. MOVB #340,@#PS ; LOCK OUT ALL INTERRUPTS ABRT BR ABRD30 ; GO FINISH UP ABRT ; ; ABRC10 =. ; HERE ONLY IF ABORTING THE ACTIVE TASK ABRT MOV ACTIVE,R1 ; GET TASK'S HEADER ADDRESS TO CLEAR ABRT CLR TSTACK(R1) ; THE TASK STA CHPTDS BR PTDS ERFT APTRUERNT IANR FOE ER HITWA; ITWA ; ; =. 69PWDS D BAD BAD BA; LTHA . NO; 69PWDS Q BE ? NGPIEECRK ACSTM TEYS SHE TIS; CKTASS,#SP P CM CKTASS EF.R ; UT OCKHE COR FLYON; ; . ITO DGO S.YE; 20PADS T BG PTDS K?ECCHO TLSVELEE OR MNY A. NO; 2 ,RR4 P CM . ITD OA LGO S.YE; 10PLDS E RHEADER ASR R3 ;RESTORE INDEX TO BYTE TABLE USAGE MOVB NXTMSG(R3),RLSECT(R4) ;PUT REL SECT ADDR IN BUFFER HDR MOV R0,-(SP) ;MAKE DISC READ REQUEST JSR PC,DISCIO TST ERROR(R0) ;ANY REQUEST ERRORS? BEQ PRTA85 ;NO CLRB DAVAIL(R3) ;YES, CONVERT TO CORE Q FOR UNIT/LEVEL BR PRTA47 ;GO EXAMINE Q'S .ENDC ; ; ; PROCESS INTERRUPT FROM ECHO OF INP 0 R6TD T NE B ? ORRR ESCDIA E ERTHS WA ; 1)(RORRR E ST T S ERSTGIREE AV;S HRUS,PR5 R JS . =1 DRTY T; ;- -ITEXN PO UNSIOITNDCO ; ;T IS LSTUEEQ R/O ISCDIF OSSREDD ANSAINTCO1 R ;; --Y TRENN PO UNSIOITNDCO ; ;1 DRTY,TPC R JS ; ;- -CEENQUSEG INLLCA ; ;E INUTRON IOETPLOM C/O IADREC IS D--1 DRTY T ;; ;E AG.P EMSTSYF BUG MSR FOG INOWLLFOM SEAS ; F BUSG M G PCK POINTER FOR DISPTCH ABRT CLR ACTIVE ; GET RID OF THE ACTIVE TASK ABRT CLR COUNTR ; AND THE TASK'S COUNTER ABRT CLR MFLAG ; CLEAR TASK LOCKOUT MOV SP,R1 ; HERE WE MUST TRANSFER , IN ORDER, THE ABRT ADD ATASK+4,R1 ; CONTENTS OF THE TASK STACK TO THE SYS ABRT MOV STACK,SP ; STACK SO THAT THE RETURN (ABRFIN) WILLABRT MOV -(R1),-(SP) ; BN PTDS ? ELEV LISTHN INGHIYTAN; ) R2T(RSFI T TS: 25PADS PTDS 2)L=VELET RSFIX(DEINL VELET ENEMCRIN; 2 ,RR3 D AD PTDS S.YE; CHPTDS E BN PTDS ? CHARSET ARSTRE; NASYSB T TS: 20PADS 3. RTOINT ENEMCRINX DEINL VELET PU; 3 ,R#2 V MO ERNTOU CELEV LASE USO TR2R EACL; R2 R CL PTDS X DEIND OR W ATOT IFSHN HE T4, RTOIN; NUT CHAR ; PRTB10 = . INCB TTCURS(R1) ;INCR CURSOR FOR THIS TTY UNIT PRTB20 = . MOV OTIMER(R5),-(SP) ;DEQUEUE ECHO TIMER JSR PC,DQTIME TST (SP)+ BR PRTA85 ; ; ; PROCESS INTERRUPT FROM ECHO OF FORMATTING LF ; PRTB30 = . MOVB #1,CHTYPE(R1) ;SET CHAR TYPE FOR NORMAL ECHO CLRB TTCURS(R1) ;SET CURSOR TO BEGINNING OF LINE BR PRTB20 ;GO DEQUEUE ECHO TIMERIF . C ND.E 47TAPR P JM VESA NETIOU;R T UPRRTEINR TEINPRO TCEANTRINE AK;M ) SP-(9,D1TY#T V MO 2 T*NI UET;G R5 L AS . NOT NI UTY TET;G 1 ,RR5 V MO K ACSTN OPSE AVLE, UTKOOC LSEEAEL;R S ,PP)(S VBMO SYBUT NI UET;S 5)(RRTYPTT RBCL . = 40YDTT RNTUREO ;G 18YDTT BR RECON ISTLIE EUQU ; T ISQLC, P SR J LWORK. (GLAD WE ONLY DO THIS ONCE!) ABRT MOV -(R1),-(SP) ; FIRST, THE TASK# AND THE PC. ABRT .IFNZ RGSAVE ; ABRT MOV -(R1),-(SP) ; THEN R0 & R1, IF SAVED. ABRT MOV -(R1),-(SP) ; ABRT .IFG $ABMES ; ABRT MOV -(R1),-(SP) ; NEXT R2 IF USING ABORT MESSAGES. ABRT R4 L AS PTDSS ELEV LTYRIIOPRF OERMBNUT ENRRCUT PU; 4 ,RLSVELE V MO D.BAS ASTJU S.YE; RRPEDS E BN ? UTKOOC LSKTAR DEUNG INNNRU; G LAMF T TS D BA, AD BD,BA S.YE; RRPEDS E BN ? NGNIUN RNGHIYTAN; VETIAC T TS PTDS . E)OVABE SE (AGFLR EACL; NASYSB R CL PTDS TSUPRRTEINL ALW LOAL; PS@# RBCL T INPOY TREN; J ; ; ; PROCESS INTERRUPT FROM ECHO OF FORMATTING CR ; PRTB40 = . MOVB #LF,@TTODBR(R5) ;OUTPUT A FORMATTING LF MOVB #2,CHTYPE(R1) ;SET CHAR TYPE FOR FORMATTING LF BR PRTA85 ;GO RETURN ; ; ; PROCESS INTERRUPT FROM ECHO OF "U" ; PRTB50 = . TSTB TOIFLG(R1) ;DOES TIMEOUT FLAG INDICATE AN BNE PRTB55 ;ABORT OF INPUT REQUEST PROCESSING MOVB #CR,@TTODBR(R5) ;NO, OUTPUT A FORMATTING MST PUUT OOFG INEUQUR FOG ART SE, NO ; 4 R LR C O. NITUNT GE ; R15, R OV M . =0 D3TY TE OR CIND UEUE QBEL IL WELEV;L ND AITUNS HI TOR FTSESQUREE URUT;F SOG LA FILVA ALEFIC IS DETES;R 3)(RILVADA RBCL D OR WORRR ETOE OD CORRR ESCDIE OV;M 0)(RORRR,ER4 V MO . =5 D2TY T; RNTURE ; C P TS R S ERSTGIREE ORSTRE ; PRPO5, R SRH .ENDC ABRT .ENDC ABRT MOV -(R1),-(SP) ; FINNALLY THE PS. THIS INLINE CODE IS,ABRT ; AT MOST, ONLY 1 WORD LONGER THAN A ABRT ; LOOP. AT BEST IT IS 2 WORDS LESS. ABRT ; ABRD10 =. ; .IFNZ OVRLAY ; CMPB R0,#OVTMIN ; IS THIS =. CHPTDS PTDS H.TCSP DOFG INNNGIBE; PTDSHE TATD REEACLS IAGFLE TH T.UPRRTEIN; PTDST RSFIE THN OVETIACE ARS SKTAO NENWH; PTDSE AV SBYT SES IAGFLE TH ).EDCHATSPDI; PTDS S IITE OREF BUT(BD UNFOS ISKTA; PTDS A N HE WORD HERCEA SISL VELEW NEA ; PTDSR HEIT EFG CR MOVB #3,CHTYPE(R1) ;SET CHAR TYPE FOR FORMATTING CR BR PRTA85 PRTB55 = . CLRB TOIFLG(R1) ;RESET INPUT TIMEOUT FLAG BR PRTC15 ;GO CR, LF, AND DO END PROCESSING ; ; PROCESS INTERRUPT FROM ECHO OF "^" ; PRTB60 = . MOVB #'U,@TTODBR(R5) ;OUTPUT A "U" MOVB #4,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF "U" PRTB70 = . INCB TTCURS(R1) ;INCR CURSOR BR PRTA J . = 20YDTT AGFLE USN ISTLIO I/E ITWRC IS DETES;R U LIDW RBCL . = 19YDTT UTKOOC LSEEAEL RES;Y PS+,P)(S VBMO O ;N 40YDTT I BM Y?US BITUNS ;I 5)(RRTYPTT TBTS S PTRUERNT IUTKOOC;L T OUOC,LPC R JS . = 18YDTT RDWOD EAHR TSTLIY TTR NC;I 0)(R C IN . =5 D1TY TG LA FLLFUR FEUF BET SS,YE ; ) R3L(ULBF D B NC I O ;N 15YDTT E BN DAN OVERLAY TASK? ABRT BLO ABRD30 ; NO. ABRT MOVB #8.,TSTAT(R0) ; SET STATUS TO 8 FOR RPOM. ABRT MOVB (SP),@#PS ; ALLOW INTERRUPTS ABRT MOV R0,-(SP) ; SAVE TASK NUMBER ABRT MOV R0,-(SP) ; PUSH TASK NUMBER FOR RPOM ABRT JSR PC,DQOVLY ; CALL ON RPOM. ABRT ENWHN PEAP HLLWIS HI T. CHARSE; PTDSE EUQUS ITT ARSTRET US MERCHATSPDIE TH; PTDS ND AONS IITE ONO TALQU EIST IENWH; PTDS . FF OIST IROZEO TALQU EIST IENWH; PTDS . CHARSES R'HETCPAIS DHE TRTTAES RTO; PTDS ENWHE INRMTEDEO TRETOES/RVESAD AN; PTDSR HETCPAIS DHE TBYE USR FOG LA FNEFIDE; B85 ;GO RETURN ; ; ; PROCESS INTERRUPT FOR ECHO OF "^" ; PRTB80 = . MOVB #'^,@TTODBR(R5) ;OUTPUT A 2ND "^" MOVB #5,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF 2ND "^" BR PRTB70 ; ; PROCESS INTERRUPT FOR ECHO OF "\" ; PRTB90 = . MOVB SLSHCH(R1),@TTODBR(R5) ;OUTPUT NEW OR DELETED ;CHAR AFTER BACKWARD SLASH MOVB #1,CHTYPE(R1) ;SET CHAR TYPE FOR NORMAL ECHO BR LLFUE IL FERFFBUC IS DIS ;3)(RSGTMNX),R3C(SEXT N B MP C . = 10YDTT LEFIF OORCTSET 1SO TERNTOI PET;S 3)(RECTSNX RBCL . =5 D0TY T0 D1TY T R B ) R3C(SEXT,NR4 VBMO R4Z,FSBU#D D AD ZESIG MSE ONY BERNTOI PMPBU ; R4),R3C(SEXT N B OV M S YE ; 5 D0TY T GE B D SE UENBEE IL FOFR TOEC SOP TAS;H1 Z-ESIL#F),R3C(SEXT N B MP C S YE ; 0 D3TY T EQ B ? DEMAS WAT ESQURE ; @ MOV (SP)+,R0 ; RESTORE R0 (TASK NUMBER) ABRT MOVB #340,@#PS ; LOCK OUT INTERRUPTS ABRT .ENDC ABRT ABRD30: MOVB #7,TSTAT(R0) ; SET ABORTED STATUS. .IFG $ABMES ; ONLY INCLUDE IF MESSAGES WANTED. ABRT AB2MES =$ABMES+$ABMES-2 ; NEED THIS VALUE FOR WORD INDEX VALUE ABRT MOV #AB2MES,R2 ; GET NUMBER OF MESSAGE BUFFERS *2 0 D OR.W: NASYSB PTDS ; K ACST EF.R PTDS ; NASYSB EF.D NTOI PRYNT ENEFIDE; CHPTDS EF.D E AG.P **********************************************************************;* * ; * : ERMBNUE GULOTACA ; * > PRTB70 ; ; PROCESS INTERRUPT FOR ECHO OF EOM CHARACTER ; PRTC10 = . .IFZ EOMOPT INCB TTCURS(R1) ;INCR CURSOR BR PRTC55 ;CR, LF NOT OUTPUT AFTER EOM .ENDC PRTC15 = . MOVB #CR,@TTODBR(R5) ;OUTPUT A CR MOVB #11.,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF A ;CR FOLLOWING AN EOM BR PRTB70 ; ; INTERRUPT FROM OUTPUT OF LF IN OUTPUT MODE ; PRTC20 ISTHE NCSID LEAI FSCDIS HA ; ) R3L(AIAV D B ST T S YE ; 5 D2TY T NE B ? ORRR ETERI WSCDIA E ERTHS WA ; 4 ,R1)(RORRR E OV M L VELE+ T NI*U 2 =EXND;I 3 ,RR2 D AD ELEV LET;G R2),R0L(VELE VBMO 2BYO NITUNT UL;M R3 L AS 3 ,RR5 V MO . NOT NI UTY TET;G5 ,R0)(R+1EMSTSY VBMO SCDIN OENTTRI;W STLAT IS LSTUEEQ RTY TOFS ESDRADT GE ;R0T,LSTR+TUFCBDS < ABRT ABRM10: MOV ABMTAB(R2),R1 ; SEE IF THIS MODULE IS FREE BY CHECK ABRT CMP (R1),#1 ; OF THREAD WORD. =1 IF FREE. ABRT BEQ ABRM20 ; FREE. GO USE IT. ABRT SUB #2,R2 ; SEE IF ANY MORE BUFFERS ARE LEFT ABRT BGE ABRM10 ; YES. GO CHECK IT. ABRT BR ABRFIN ; NONE LEFT. RETURN WITHOUT MESSAGE. ABRT ABRM20: MOV R0,4(R1) ; 0 : ONSIVIRE ; * 1 -7EP-S29 : TEDA ; * 53: ERMMRAOGPR ; * ; * . TSISEXN IOITNDCOR ROERN AH,TCSP D ; *O TRYNT EONO ERNZNOS IG'LAMF 'OR' VETIAC 'ERTHEIF I ; * ; * S.RO: = . CLRB CHTYPE(R1) ;SET CHAR TYPE TO OUTPUT MODE JMP PRTA17 ;GO CONTINUE OUTPUT OF MSG ; ; PROCESS INTERRUPT FOR OUTPUT MODE CR ; PRTC30 = . MOVB #LF,@TTODBR(R5) ;OUTPUT A LF CLRB TTCURS(R1) ;RESET CURSOR TO BEGINNING OF LINE MOVB #9.,CHTYPE(R1) ;SET CHAR TYPE FOR OUTPUT MODE LF BR PRTA85 ;GO RETURN ; ; PROCESS INTERRUPT FOR ECHO OF CR FOLLOWING AN EOM ; PRTC40 = V MO RSTEISEG RVESA ; R SHPU5, R SR J . = W1YDTT ;; STLIT ESQUREE ITWRC IS DOFS ESDRADS INTAON CR1 ; ;- -RYNT EONUPS ONTIDION C ;; W1YDTTC, P SR J ;; --E NCUEEQ SNGLIAL C ;; TERI WSCDIR FOE INUTRON IOETPLOM C/O I--1 DWTY T ;; ;E AG.P UFGBMS FG.I DCEN . N URET;R PC S RT RSTEISEG RRETOES;R R OP,PR5 R JS NO ; 5 L1OV M LT B8PUT TASK NUMBER IN FIRST ARGUMENT ABRT MOV R1,-(SP) ; PUT ADDRESS OF BUFFER ON STACK FOR CALABRT JSR PC,LERTYP ; THE PS IS ALL READY ON STACK ABRT BR ABRE10 ; THEREFORE, NEED THIS BRANCH ABRT .ENDC ABRFIN =. ; COMPLETION EXIT ABRT MOVB (SP)+,@#PS ; ALLOW INTERRUPTS ABRT ABRE10: .IFNZ RGSAVE ; ERROR RETURN .IY BEDEVCIRES IPTRUERNT I ; * N AERFT AFTLEE BLYONL IL WCHHI WOPLOT AI W AERNT E ; L*IL WIT, EDEUQUY TLENRRCUE ARS SKTAO NATTHS NEMIERET D ; * CHPTDSF I. ERLLCAE THO TEDRNTURER VENES IOLTRON C ; * ; * H TCSP DP JM ; * ; * 6 . MOVB #LF,@TTODBR(R5) ;OUTPUT A LF MOVB #12.,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF LF ;FOLLOWING AN EOM BR PRTA85 ;GO RETURN ; ; PROCESS INTERRUPT FOR ECHO OF LF FOLLOWING AN EOM ; PRTC50 = . CLRB TTCURS(R1) ;RESET CURSOR TO BEGINNING OF LINE PRTC55 = . MOV ILSTAD(R5),R0 ;GET CURRENT INPUT LIST ADDRESS JMP PRTA40 ;GO DEQUEUE ECHO TIMER ; ; ; ? EDOV MLL;A 2 ,RR4 P CM ERFFBUO TSG MOFR HA C 2OV;M + 4)(R+,0)(R V MO . =5 L1OV MR FEUF BTOE OV MSG MOR FITIM LET;S 2 ,RR4 D AD ERFFBUO TRDWOX DEINE OV;M + 4)(R+,0)(R V MO RDWOX DEINO TERNTOI PET;S + 0)(R T TS R FEUF BTO) NTOU CARCH (ZESIG MSE OV;M )+R4,(R2 V MO . = 12VLMO EXND ITOE IZ SSG MET;G 2 ,R0)(R V MO . =0 L1OV M2 L1OV M R B 4FG $ABMES ; ONLY NEED IF WE HAVE ABORT MESSAGES ABRT MOV (SP)+,R2 ; RESTORE R2 (ONLY WITH ABORT MESSAGES) ABRT .ENDC ABRT MOV (SP)+,R1 ; RESTORE REGISTERS IF NEEDED. MOV (SP)+,R0 ; ABRT .ENDC ; FIX UP STACK SO THAT TASK NO. IS GONE MOV (SP)+,(SP) ; THEN WERE READY FOR RTS PC. : ONTIUCTRNS I ; * G INOWLLFOE THY BCHPTDSO TEDSSPAS IOLTRON C E:AGUS ; * ; * . EDORSTRET ENOMIRNV EIRHE T ; *VEHAS SKTAD DEENSPSU S.SKTAD TECUXENE UND AEDNDPEUS S ; * THBOS LEAD HCHPTDS K.AS TEDEUQUY ITORRI PSTHEIG H ; *HE TTETA SVETIACE THN ICELA PTOD SE UISE INUTROS HI TE:OSRPPU ; * 2 PROCESS INTERRUPT FOR ECHO OF RUBOUT FOR TTY TURNON ; PRTC60 = . TSTB TTYON(R1) ;IS TTY UNIT WARMUP COMPLETE BNE PRTC65 ;NO JMP PRTA80 ;YES PRTC65 = . MOVB #RO,@TTODBR(R5) ;OUTPUT ANOTHER RUBOUT DECB TTYON(R1) ;DECR COUNT JMP PRTA85 ;RETURN .PAGE ; ; KBDINT -- TELETYPE KEYBOARD/PT READER INTERRUPT ROUTINE ; ; CONDITIONS UPON ENTRY -- ; ; ) R04(,-SZRMER # OV M STLIF ORDWO" ORRR"EN IDECOR ROERT SE ;) R44(,-SZRMER # OV M EDOWLL AAX MTOG MSE ATNCRU TS,YE ; 2 ,RSZSGOM # OV M O ;N 10VLMO E BL IZ SSG MAX MT..GG MSN IARCHF OO. NRE;A SZSGOM,#0)(R P CM SSREDD ATADAT GE ; R0),R0 ( OV M O ;N 05VLMO T BL D?VEMOT IS LOFL AL ; R24, R MP C R FEUF BTOT IS LOFD OR W AOV;M + 4)(R+,0)(R V MO . =5 L0OV M0 ABRT RTS PC ; .PAGE ABRT .IFG $ABMES ; ONLY NEED IF WE HAVE ABORT MESSAGES ABRT ; THERE IS A LIMIT TO THE NUMBER OF SYSGENABLE ABORT MESSAGE ABRT ; BUFFERS THAT CAN BE ADDED TO THE SYSTEM WITHOUT ADDIONAL CODE ABRT ; BEING ALSO ADDED. THE CHECK BELOW PREVENTS AN EXCESIVE ABRT ; REQUEST FROM BEING MADE. ADDIONAL BUFFERS REQUIRE THE BUFFER ABRT ; * K.AS TEDEUQUT ESGHHIE ATIVCT-ACHPTDS: ONTICAFITIENIDM RAOGPR ; * ; * H C T P S D ; **********************************************************************;* E AG.P SPUN ; 00SDUN BR SPUN ERUSO TRNTUREE RCFO; ) SPN(TRUR. TTY UNIT NO. IS CONTAINED IN BITS 0-3 OF PS ; AS PROVIDED BY INTERRUPT VECTOR FOR ; INTERRUPTING UNIT ; ; ROUTINE IS ENTERED AT PRIORITY LEVEL OF UNIT VECTOR ; ; KBDINT = . SAVE ;CALL SAVE ROUTINE MOVB PS,R1 ;GET UNIT NO FROM BITS 0-3 OF PS BIC #177760,R1 MOV R1,R5 ASL R5 ;UNIT * 2 USED AS INDEX TO WORD TABLES MOV ITIMER(D OR WXTNEO TERNTOI PET S. STLIF ORDWO ; )+R0 ( ST T D EAHR TINS ESDRADT IS LALINIGORE AV;S )+R4,(R0 V MO R2.,12 # DD A E OV MSTLIR FOT MILIT SE ; R24, R OV M S ERSTGIREE AV;S HRUS,PR5 R JS . =T LSOV M; EDATNCRU TIST I ;, Z)GSMS(OE IZ SSG MAX MANTHR GEON LAS WSG MIF ; ;- -ITEXN PO UNSIOITNDCO ; ;D VEMOE BTOE ARA AT DGESAES MND ASTLI ;H ICWHO NT, ; AND AN ENTRY IN THE WORD TABLE ABMTAB. ABRT ; ABRT .IFG $ABMES-5 ; THE CURRENT MAXIMUM NUMBER OF ABORT ABRT XXXXXX ; MESSAGES BUFFERS IS 5. ABRT .ENDC ABRT ; ABRT .IFGE $ABMES-1 ; R CL SPUN USATSTL GALEIL; P)(S C IN: 10SEUN SPUN OMRP; P)(S C IN: 20SEUN SPUN R BEUM NSKTAL GALEIL; P)(S C IN: 30SEUN ; S ORRR EOR FREHE; ; . NGHI T'SITO DERCHATSPDIE THT LE; CHPTDS P JM SPUN NDPEUS SGO; I VESA,QPC R JS SPUN ONSIENSPSUY ARNTLUVOINR FOT SE; P)(S,-#1 V MO SPUN*R5),R4 ;GET ADDRESS OF OPERATOR RESPONSE TIMER MOVB #TTITIM,TCNTR(R4) ;PUT COUNT INTO TIMER MOV ILSTAD(R5),R0 ;GET ADDRESS OF LIST CURRENTLY ;BEING PROCESSED MOV DATA(R0),R2 ;GET DATA BUFFER ADDRESS TST (R2) ;IS ECHO SPECIFIED BY USER BUFFER BPL KBDA10 ;NO MOV OTIMER(R5),-(SP);YES, QUEUE ECHO TIMER MOV #TTOTIM,-(SP) JSR PC,QTIME TST IERFFBUF OSSREDD AHE TNSAINTCO4 R ;T IS LSTUEEQ RTY TOFS ESDRADE THS INTAON CR0 ; ;- -RYNT EONUPS ONTIDION C ;; STVLMOC, P SR J ;; --E NCUEEQ SNGLIAL C ;; STLIF O ; RDWO" EMSTSY "WSLOOL FTADAG MSE ERWHR FEUF B ;A O TTADAD ANT IS LTY TVEMOO TNETIOUBRSU- -STVLMO ; ;; GEPA . F BUSG M G IF . C ND.E RNTUREO ;G 05CWDS BR ELEV/LEV DISTH ; ( ABRT ABMES1: .WORD 1 ; MESSAGE BUFFER 1. THREAD WORD. ABRT .WORD 99. ; ERROR CODE ABRT .WORD 0,0,0,0 ; ARGUMENTS FOR ERRTYPE. ABRT .IFGE $ABMES-2 ; ABRT ABMES2: .WORD 1,99.,0,0,0,0 ; MESSAGE BUFFER 2. ABRT .IFGE $ABMES-3 ; ABRT ABME 1 VESA QOR FCKTA SONS PVEMO; P)(S-2VESA-URNRT,UPS@# VBMO SPUN ERCHATSPDIE THN OLLCA; =. 30SDUN ; P S== < PC ; USATST ; ; : RNTUREN OAY WISTHS OKLOK ACST; ; RNTURE; PC S RT SPUN . RG ARNTUREO NT OPCE OV M. RNTURE; P)(S+,P)(S V MO H.TCSP DSE U. =1; 30SDUN T BG SPUN DECON URET RSTTE; ) SP2(E-AVUSN-TR& (SP)+ ;POP ERROR CODE OFF STACK KBDA10 = . MOVB @TTIDBR(R5),R4 ;GET CHAR WHICH WAS INPUT BEQ KBDA20 ;PUNCHED TAPE LEADER OR "HERE IS" KEY? BICB #200,R4 ;STRIP OFF CHANNEL 8 OF TTY INPUT CHAR CMPB R4,#EOMCH ;NO, IS IT THE EOM CHAR? BEQ KBDB70 ;YES CMPB R4,#CR ;IS IT AN EOM CR? BEQ KBDB50 ;YES CMPB R4,#EOLCH ;IS IT THE END OF LINE R FOG LA FILVA ALEFIC IS DETES;R 3)(RILVADA RBCL D OR WORRR ETOE OD CORRR ESCDIE OV;M 0)(RORRR,ER4 V MO . =0 W1SC DN URET;R PC S RT EG RRETOES;R R4+,P)(S V MO . =5 W0SC DS YE ; 0 W1SC D NE B ? ORRR ESTUEEQ RSCDIA E ERTHS WA ;R4R,ROERT+ISWL D OV M E ITFR,PPC R JS STUEEQ RTERI WSCDIE AK;M ) SP-(T,ISWL#D V MO ERFFBUO TTADAE AGSSMED ANT IS L$S3: .WORD 1,99.,0,0,0,0 ; MESSAGE BUFFER 3. ABRT .IFGE $ABMES-4 ; ABRT ABMES4: .WORD 1,99.,0,0,0,0 ; MESSAGE BUFFER 4. ABRT .IFGE $ABMES-5 ; ABRT ABMES5: .WORD 1,99.,0,0,0,0 ; MESSAGE BUFFER 5. ABRT .ENDC ABRT .ENDC UR T TS C ND.E ; R1+,P)(S V MO ; R2+,P)(S V MO ; R3+,P)(S V MO ; R4+,P)(S V MO Y.ANF IS,ERSTGIRED VESAL ALE ORSTRE; VESARG Z FN.I SPUN N URET ROR FUSATSTR ROERT SE; P)(S-2RRUE+,P)(S V MO . TSUPRRTEINW LOAL; S #P,@R3 VBMO SPUN P. USHNIFIO TREHE; =. 00SDUN ) =2 (. EDEUQUO TUSATSTT SE; ) R4T(TATS "CHAR? BEQ KBDA50 ;YES CMPB R4,#MRCH ;NO, IS IT THE MSG RESTART CHAR? BEQ KBDA70 ;YES MOV R2,R3 ;GET POINTER TO CHAR SLOT IN DATA BUFFER ADD #MSGDAT,R3 ADD CHCNT(R2),R3 CMPB R4,#RO ;IS CHAR A RUBOUT (DELETE A CHAR)? BEQ KBDA80 ;YES TSTB FRSTRO(R1) ;IS IT 1ST CHAR AFTER SOME RUBOUTS? BNE KBDB20 ;YES KBDA13 = OV MGO ; STVLMOC, P SR J R FEUF BSCDIR TEINPOT SE ;R4T,LSTR+TUFCBDS # OV M F BUC IS DINR DD ACTSEL RET PU ;CTSERLF+BUSC,D3)(RECTSNX VBMO LEAB TORCTSET EX NTOX DEINT SE ; 3 R SR A R FEUF BTERI WSCDIN IIDE IL FUT P ;UFCBDS),R3D(EIIL F OV M E BLTAD ILEFIO TEXND IET;S R3 L AS ERSTGIREE AV;S P)(S,-R4 V MO . =T CWIS D; V)LE+ T NI U *(2E BLTAO TEXND IELEV/LITUNS INTAON CR3  ABRT .ENDC ABRT .ENDC ABRT .ENDC ABRT .IFGE $ABMES-1 ; ABRT ABMTAB: .WORD ABMES1 ; TABLE OF ADDRESS OF ABORT MESS. BUFFERABRT .IFGE $ABMES-2 ; ABRT .W CBIN . T'AS'LW NEO TNTOI PTO' STLA 'TEDAUP; ) R1T(AS,LR2 V MO N HE TK.AS TEW NTOT INPOL AI TLD OKEMA; 1)(RSTLA,@R2 V MO SPUNERAT LEDNET N'DO. EXND IRDWOO NT IKEMA; R1 L AS SPUN Y ITORRI PEDAV S'SSKTAT GE; 1 ,R2)(RORRIHP VBMO EUQUF OND(E O.ER ZTOD OR WADRETHT SE; 2)(R C DE SPUN EXND ITEBYA O NT ICKBA4 RGEANCH; R4 R AS . SSREDD AERADHEM RAOGPRT GE; 2 ,R4) . MOV (R2),-(SP) ;STRIP OFF BITS 14,15 OF 1ST WORD OF BIC #140000,(SP) ;BUFFER TO GET NO. OF CHARS TO BE INPUT CMP CHCNT(R2),(SP)+ ;HAVE TOO MANY CHAR BEEN INPUT? BGE KBDB30 ;YES INC CHCNT(R2) ;INCREMENT CHAR COUNT MOVB R4,(R3) ;MOVE CHAR TO USER'S BUFFER TST (R2) ;NO, IS ECHO SPECIFIED? BPL KBDA15 ;YES KBDA14 = . BIT #040000,; RYNT EONT IS LOFS ESDRADS INTAON CR0 ; ;- -RYNT EONUPS ONTIDION C ;; WTSCDIC, P SR J ;; --E NCUEEQ SNGLIAL C ;; STUEEQ RTERI WSKDIE AK M ;, ENTH; ERFFBUE ITWRC IS DTOA AT DSG M ;D ANT IS LSTUEEQ RTY TVEMOO TNETIOUBRSU- -WTSCDI ; ;; GEPA . M TEYS SUF BSG MOR FNGWILOOL FEMSS;A UFGBMS FG.I RNTURE ; C P TS R S ERSTGIREE ORSTRE ; PRPO5, R SR J ORD ABMES2 ; ABRT .IFGE $ABMES-3 ; ABRT .WORD ABMES3 ; ABRT .IFGE $ABMES-4 ; ABRT .WORD ABMES4 ; ABRT .IFGE $ABMES-5 ; ABRT .WORD ABMES5 ; (RERADHE V MO SPUN X DEIND OR W ATOIN4 RKEMA; R4 L AS ; =. 00SCUN C ND.E SPUN . USATSTR ROER; 20SEUN BR SPUNUSATSTG INTTSER TEAFN URET RK. OUSATST; 00SDUN Q BE SPUN S TUTA SSTTE; R2 T TS SPUN R)TEISEG RPS (R3E ORSTRE; R3+,P)(S VBMO SPUN USATSTR ROERT GE(R2) ;IS INPUT ON PUNCHED TAPE? BNE KBDA20 ;YES MOV #ECHOCH,R4 ;NO, GET NON-PRINTING ECHO CHAR KBDA15 = . MOVB R4,@TTODBR(R5) ;YES, OUTPUT CHAR FOR ECHO KBDA20 = . MOV ITIMER(R5),R3 ;GET ADDRESS OF OPERATOR RESPONSE TIMER MOVB #TTITIM,TCNTR(R3) ;SET TIMER BIT #040000,(R2) ;IS INPUT ON PUNCHED TAPE BNE KBDB40 ;YES KBDA30 = . JMP RESTOR ;R S ARCH" "^O TWF OST 1OR FPETYR HA CET;S 1)(RPETYCH.,#6 VBMO ^" " AUTTPOU ;5)(RBRODTT,@'^ # B OV M UTEOIM TUTNP IOR FDECOR ROERT SE ;0)(RORRR,ETORIER # OV M S ESDRADT IS LUTNP INTREUR CET;G 0 ,R5)(RADSTIL V MO ) O. NITUNN IRS OERIM(TE YT BAGFLO ER;Z FBIMIT RBCL G LA FUTEOIM TET;S 1)(RLGIFTO CBIN PTRUERNT IBD KLEABIS;D ) R5R(CSTI@T RBCL R5 L AS NGXIDEINE BLTAD OR WOR F*2ITUN ; R51, R ABRT .ENDC ABRT .ENDC ABRT .ENDC ABRT .ENDC ABRT .ENDC ABRT .ENDC ABRT .PAGE ; R2+,P)(S V MO SKTAY LAEROV (. FFTU S'SITO DOMRPT LE; Y OVNS,UPC R JS SPUN ERMBNUK AS TSHPU; P)(S,-R4 V MO SPUN M PO RERFT ATO3 RVESA; P)(S,-R3 VBMO SPUN TSUPRRTEINW LOAL; S #P,@R3 VBMO SPUN M PO ROR FUSATSTT SE; 4)(RATST,T#1 VBMO SPUN . ITO D I. RECO; 00SCUN O BL SPUNK)OR WETURN ; ; PROCESS END OF LINE CHARACTER ; KBDA50 = . MOVB #CR,R4 ;GET CR FOR OUTPUT MOVB #3,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF CR BR KBDA15 ;GO OUTPUT CR ; ; PROCESS MESSAGE RESTART CHARACTER ; KBDA70 = . MOVB #'^,@TTODBR(R5) ;OUTPUT A "^" MOVB #5,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF "^" CLR CHCNT(R2) ;ZERO CHAR COUNT FOR RESTART OF INPUT BR KBD OV M E YT BAGFLR METIM RO FO. NITUNT GE ; R1B,MFTI I B OV M S ERSTGIREE AV;S HRUS,PR5 R JS . =O ITTY T ; STUEEQ RHE T ; OFT ORABN ACTFEAFO TET SISE YP TERCTRAHA C ; --T XI EONUPS ONTIDION C ; ;E YT BAGFLR METIT PUINN IEDINTAON CIS. NOT NI U ; ;- -RYNT EONUPS ONTIDION C ;; TOYITTC, P SR J ;; --E NCUEEQ SNGLIAL C ;; NETIOU RUTEOIM TUTNP I--O ITTY T  FTSK ;***********************************************************************FTSK ; F R E T S K *FTSK ; *FTSK ; PROGRAM IDENTIFICATION: FRETSK *FTSK ; *FTSK ; PURPOSE: THE FUNCTION OF THIS ROUTINE IS TO PLACE ESDOO WH( ? SKTAE OR CORY LAEROV; INTMOV,#R4 PBCM SPUN 1.S ROR FOK OCBLT EX NEDNET N'DO; AYRLOV FG.I SPUN S ESGRRO PING INEUQUS AUSATSTT SE; 4)(RATST,T#1 VBMO SPUN ; =. 20SAUN SPUN R.ROER. NO; 10SEUN E BN SPUN D?DEENSPSU- 4 S=TUTA SHE TIS; #4),R4T(TATS PBCM SPUN S PTRUERNT ILL AUT OCKLO; S A30 ;GO RETURN ; ; PROCESS RUBOUT CHARACTER (CHARACTER DELETION) ; KBDA80 = . TST CHCNT(R2) ;IS CHAR COUNT ZERO? BEQ KBDA20 ;YES, IGNORE RUBOUT DEC CHCNT(R2) ;DECR CHAR COUNT TST (R2) ;IS ECHO SPECIFIED BMI KBDA15 ;NO DEC R3 ;POINT TO LAST CHAR INPUT TO BUFFER TSTB FRSTRO(R1) ;IS THIS 1ST RUBOUT? BNE KBDB10 ;; ;E AG.P RNTURE; PC S RT . = 65YOTT P TYRR,EPC R JS T ESQURET OUPETYE OD CORRR EKEMA; ) SP-(D,MORR#E V MO 65YOTT E BN Q?P TYRR EINE ULOD MORRR EIS; 1 ,#ODRMER P CM . = 60YOTT ; ; 40YOTT BR T ESQURET OUPETYE OD CORRR EKEMA; 0 O6TY,TPC R JS NO; 3)(RTOSTFR CBIN S YE; 40YOTT E BN D?PETYY SLOUVIRE PENBEG MSR ROERS HA; EITHER A *FTSK ; QUEUED OR SUSPENDED TASK IN THE QUIESCENT STATE. *FTSK ; *FTSK ; USAGE: THE LINKAGE FOR THIS ROUTINE IS: *FTSK ; *FTSK ; 1). MOV FTASK,-(SP) (ASSEMBLY) *FTSK ; EMT FRETSK *FTSK ; #P,@40#3 VBMO SPUN L.GALEIL S.YE; 30SEUN I BH SPUN ERMBNUK AS TALEG LOP T >K#AS TIS; KSAS,TR4 PBCM SPUN ALEGLL I. =0 #SKTA; 30SEUN Q BE SPUN D ENSPSUUNO TSKTAF OERMBNUT GE; R4),SPK(ASUT SBBI SPUN ADLOE YT BOR FR4R EACL; R4 R CL SPUN ERSTGIRER ROERR EACL; ) SP-( R CL SPUN  ;NO INCB FRSTRO(R1) ;YES, SET 1ST RUBOUT SWITCH MOVB #'\,R4 ;GET A "\" FOR OUTPUT MOVB #7,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF "\" MOVB (R3),SLSHCH(R1) ;SAVE 1ST CHAR DELETED BR KBDA15 ;GO OUTPUT "\" KBDB10 = . MOVB (R3),R4 ;GET CHAR BEING DELETED BR KBDA15 ;GO OUTPUT CHAR KBDB20 = . CLRB FRSTRO(R1) INC CHCNT(R2) ;INCR CHAR C 3)(RTOSTFR TBTS . = 50YOTT RNTURE; PC S RT GSREE ORSTRE; R OP,PR5 R JS 3)(RAGFLTO RBCL . = 45YOTT CKTA SFF ODECOR ROERP PO; + P)(S T TS METI,QPC R JS ) SP-(M,TITO#T V MO R METIT PUUT OUEUE Q ;P)(S,-5)(RERIMOT V MO N AIAGR HA CUTTPOU; 5)(RBRODTT,@R1 VBMO . =0 O4TY T5 O3TY T R B UTKOOC LSEEAEL R ; S ,P)+SP ( B OV M  MOV (SP)+,FERR *FTSK ; *FTSK ; 2). CALL FRETSK(FTASK,FERR) (FORTRAN) *FTSK ; *FTSK ; WHERE *FTSK ; FTASK IS THE NUMBER OF THE TASK TO BE FREED. *FTSK ; FERR IS A STATUS VALUE SET BY FRETSK. THE PS VESA; 3 ,RPS@# VBMO S TUTA SORRR ETOX DEIN; SKTA=U RRUE ERMBNUK AS TTOX DEIN; +2RNRT=U K ASUT SPUN . NTMEGUARN URET RTOX DEIN; +4VESA=U N TRUR C ND.E ; . =8 E AVUS ; P)(S,-R4 V MO ; P)(S,-R3 V MO SPUN ; P)(S,-R2 V MO RSTEISEG REDIRQURE VESA; P)(S,-R1 V MO OUNT MOVB R4,(R3) ;MOVE CHAR TO USER'S BUFFER MOVB R4,SLSHCH(R1) ;SAVE 1ST NON-RUBOUT CHAR MOVB #'\,R4 ;GET A "\" FOR OUTPUT MOVB #7,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF "\" BR KBDA15 ;GO OUTPUT "\" ; ; MAXIMUM CHARACTER COUNT EXCEEDED ; KBDB30 = . TSTB MAXCH(R1) ;WAS MAX CHAR PREVIOUSLY EXCEEDED? BNE KBDA20 ;YES INCB MAXCH(R1) ;NO, SE . =8 O3TY T5 O4TY T R B ) R3T(1STI T B LR C ) R3T(1STO T B LR C Y US BOT NTOT NI ULD OET S ;) R3T(PRTY,T-1 # B OV M . =5 O3TY TR TEISEG RRETOES R ; 3 ,R)+SP ( OV M NGSIESOCPRT PUINR OUTTPOUT NI I ; ITINTOC, P SR J ERSTGIREE AV S ; ) SP-(3, R OV M UTKOOC LSEEAEL R ; S ,P)+SP ( B OV M 5)(RADSTIL),R2D(TALS I OV M 5)(RADSTOL),R2D(TALS O OV M 5 R SL A R5VALUES *FTSK ; ARE: *FTSK ; 0 = TASK SET QUIESCENT. *FTSK ; 1 = ILLEGAL TASK NUMBER. *FTSK ; 2 = ILLEGAL TASK STATUS *FTSK ; *FTSK ; REGISTERS: REGISTERS R0-R5 ARE USED BY FRETSK. THE WILL BE *FTSK ; RESTORED VESARG Z FN.I D.VESAS ERSTGIREF OERMBNUT ULFADE; =0 E AVUS T INPOY TREN; =. NDSPUN ; R TEINPOK ACST= <= PC ; N TRUR ; K ASUT ; ; S:OWLLFOS AKSOO LCKTA SRYNT EON; ; SPUN C ND.E SPUN ; VYSOUN EF.R SPUN ; AYRLOV T MAX CHAR EXCEEDED FLAG MOV OTIMER(R5),-(SP) ;DEQUEUE ECHO TIMER JSR PC,DQTIME TST (SP)+ BR KBDA20 ;GO SET INPUT TIMER ; ; PUNCHED TAPE INPUT ; KBDB40 = . INCB @TTICSR(R5) ;READ A FRAME OF PUNCHED TAPE BR KBDA30 ; ; PROCESS END OF MESSAGE (EOM) CHARACTER ; KBDB50 = . MOVB R4,@TTODBR(R5) ;OUTPUT CR FOR ECHO MOVB #11.,CHTYPE(R1) ;SET CHAR TYPE FOR EC1, R OV M 2 R SL A R23, R OV M 1)(RSTI1TT),R3T(1STI T B OV M 1)(RSTO1TT),R3T(1STO T B OV M T NI UEW NTOT ENNMROVIENE OV MO, N ;1)(RRTYPTT),R3T(PRTY T B OV M ES Y ; 8 O3TY T GE B Y?US BITUNW NES I ; ) R1T(PRTY T B ST T UTCOLOC, P SR J T UPRRTEINN AOR FOWNDWIE AK M ; S ,P)+SP ( B OV M 0 O3TY T GT B 4 R EC D )+R0 ( LR C ESEUQUT NI ULD OARLE C ; + 5)(RIF THE SYSGEN PARAMETER 'RGSAVE' IS SET *FTSK ; TO A NON-ZERO VALUE. *FTSK ; *FTSK ; PROGRAMMER: 53 *FTSK ; DATE: 18-NOV-71 *FTSK ; REVISION: 0 *FTSK ; CATALOGUE NUMBER: Z FN.I NDSPUN EF.D E AG.P **********************************************************************;* * ; * : ERMBNUE GULOTACA ; * 0 : ONSIVIRE ; * 1 -7EP-S27 : TEDA ; * 53: ERMMRAOGPR ; * HO OF CR KBDB60 = . MOV ITIMER(R5),-(SP) ;DEQUEUE OPERATOR RESPONSE TIMER JSR PC,DQTIME TST (SP)+ BR KBDA30 ;GO RETURN KBDB70 = . .IFZ EOMPRT MOVB #RO,R4 ;USE RUBOUT IF EOM NOT ECHOED .ENDC MOVB R4,@TTODBR(R5) ;OUTPUT EOM CHAR FOR ECHO MOVB #8.,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF EOM BR KBDB60 ; .PAGE ; ; REQPP --SUBROUTIN0, R OV M )+R2 ( ST T . =2 O3TY T 2)(R),R5 ( OV M 2 O3TY T EQ B T NI UEW NTOS STUEEQ REDEUQUE OV M ; ) R2@(),R0 ( OV M . =0 O3TY T UTCOLOC, P SR J R44, # OV M ITUND OLR FOT ASQLO TEXND IET S ; R5T,ASQL # DD A T NI ULD OOR FSTIRQFO TEXND IET S ; 0 ,RSTIRQF # DD A R05, R OV M 5 R SL A T NI ULD*O 8ET G ; 5 R SL A ITUNW NER FOT ASQLO T  *FTSK ; *FTSK ;***********************************************************************FTSK .PAGE FTSK .DEF FRETSK ; FTSK .IFNZ OVRLAY ; FTSK .REF DQOVLY ; FTSK .DEF DQRPOM ; ; *. ROZEN-NOS IVESARGR TEMERAPAN GEYS SHE TIFD RETOES R ; * BEL IL WEYTH D.PNNS UBYD SE URE AR41- RRSTEISEG R ; * E.INUTROT UPRRTEINR OETPLOM C ; */O IANR HEIT EISM RAOGPRG INLLCAE THF I=0T US MRNRT U S:TENO ; * ; SPUN * ERMBNUK AS TALEGLL I=3 ; E TO PREPROCESS REQUEST LISTS ; ; CALLING SEQUENCE -- ; ; JSR PC,REQPP ; ; CONDITIONS UPON ENTRY-- ; ; REQUEST LIST ADDRESS IS ON STACK ABOVE SAVED REGISTERS ; ; CONDITIONS UPON EXIT -- ; ; THREAD WORD OF LIST IS DECREMENTED BY 1, ; EXCEPT WHEN .NE. 1 ON ENTRY ; ; BYTE 0 OF SYSTEM WORD OF LIST CONTAINS CALLING ; TASK NO. WHICH IS ZERO IF SYSTEM WAS CALLER ; ; EXND IET S ; R2T,ASQL # DD A 2 R SL A 2 R SL A 2 R SL A T NI UEW*N 8ET G ; R21, R OV M Y TTM TEYS SONG MSR ROERE YP T ; 60YOTTC, P SR J LEDUMOR ROERN IO. NITUNW NET PU ; +6ODRMER1, R OV M T IS LNTREUR CTOIN. NOT NI UEW NUT P ;0)(R+1EMSTSY1, R B OV M . NOT NI UEW NET G ; R1),R2V(DEHY P B OV M 5)(RSRICTT @ B LR C T NI UCTUNEF DOFS PTRUERNT ILEABIS D ; 5)(RSROCTT @ B LR C  FTSK .ENDC FTSK ; FTSK ; ON ENTRY THE STACK LOOK THIS WAY FTSK ; FTSK ; TASK NUMBER FTSK ; PC <== STACK POINTER FTSK SPUN *Y)LAEROVG(ON LTOD DEENSPSUD-LEELNCCAK AS T=2 ; SPUN * ) =4OT(NUSATSTK AS TALEGLL I=1 ; * EDORON HSTUEEQ R=0 ; * : USATSTD NEURET RHE TIS RRUE ; * K.AS T ; D*UEUE QTYORRI PSTHEIG HHE TTOL RONTCOS AS P=1 ; * R.LEAL CHE TTON URET R=0  BYTE 1 OF SYSTEM WORD OF LIST CONTAINS TTY PHYSICAL ; UNIT NO. ; ; IF LIST HAD PARAMETER ERROR, THE ERROR WORD OF ; LIST CONTAINS AN ERROR CODE; OTHERWISE IT CONTAINS ; ZERO ; ; RO CONTAINS LIST ADDRESS ; R1 CONTAINS PHYSICAL TTY UNIT NO. ; R2 CONTAINS PRIORITY LEVEL ; R3 CONTAINS (2*UNIT + LEVEL) ; R5 CONTAINS 2*UNIT ; REQPP = IT BILVA AOT NCEVIDE; D ANT BIE USN ICEVIDEE ATRNTEALT SE; ) R4V(DEHY,P000012 # IS B . =6 O2TY T2 O2TY T R B O. NITUNL CAGILOE ATRNTEALT GE, ES Y ; R42, R OV M O N ; 6 O2TY T EQ B E?USN IDYEALR AEV DTENAERLT AIS; ) R4V(DEHY,P000002 # IT B O N ; 0 O5TY T NE B ? IDAL VPETYE ICEV DIS, ES Y);R2V(DEHY,P0074 # IT B O N ; 0 O5TY T NE B ? LEABILVA AEV ; FTSK .IFNZ OVRLAY ; FTSK ; FTSK ; THE ENTRY POINT 'DQRPOM' IS USED ONLY BY RPOM TO REMOVE A TIME SLICINGFTSK ; TASK FROM THE ROS THREAD. DQOVLY IS NOT CALLED. THE TASK STATUS AND FTSK ; THE PROGRAM HEADER ARE NOT MODIFIED WHEN DQRPOM IS USED. FTSK ; ON ENTRY ALL REGISTERS ARE SAVED, THEN ; * D:PNNS UOMFRN URET RHE TLSRONTCON TRUR ; * EDEUQUREE BTOK AS THE TOF# K AS THE TISK ASUT ; * REHE W ; * ; * ) ANTROR(F R)ER,URNRT,USKTA(UNDSPUN LLCA. 2) ; * ; * RRUE+,P)(S V MO . MOV 20(SP),R0 ;GET LIST ADDRESS FROM STACK JSR PC,LOCOUT ;LOCKOUT INTERRUPTS WHILE TESTING ;THREAD WORD DEC (R0) ;IS LIST QUEUEABLE BNE REQA15 ;NO, THREAD WORD .NE. 1 MOVB (SP)+,PS ;YES, RELEASE LOCKOUT MOVB DEVICE(R0),R1 ;GET LOGICAL DEVICE NO. REQA02 = . BLT REQA25 ;INVALID IF .LT. 0 CMP R1,LOGMAX ;IS I DLT AIS; ) R2V(DEHY,P000010 # IT B E ICEV*D 2 =EXND I ; 2 R SL A . NOE ICEV DALICOG LLT AET G ; R2),R4V(DELT A OV M O N ; 0 O5TY T EQ B ? STXI ECEVIDEE ATRNTEALS OE D ;4)(REVYDPH0,0040#0 T BI ESBLTAD OR WNGXIDEINR FO2 .*NOG LO; R4 L AS . = 22YOTT O. NCEVIDEL CAGILOT GE; 4 ,R0)(RCEVIDE VBMO +6ODRMER R CL LEDUMOR ROERN IO. NITUNT NCFUDET PU; 4 D+MORR,ER3 V MO  THE FOLLOWING REGISTERS ARE FTSK ; USED: FTSK ; R3 = HEADER ADDRESS FTSK ; R4 = PRIORITY LEVEL FTSK ; 'DQRPOM' SETS THE SIGN BIT IN THE STACK WORD CONTAINING THE TASK FTSK ; NUMBER. 'FRETSK' CLEARS IT. THIS IS USED TO DIFFERENTIATE THE TWO FTSK ; ENTRY POINTS ON EXIT. 'DQRPOM' RETURNS THE NORMAL ERROR STATUS. FTSK ; ; * NDSPUN T EM ; * ) SP-(N,TRUR V MO ; * ) LYMBSEAS ( ) SP-(K,ASUT V MO. 1) ; * ; * S: INETIOU RISTHO TGEKAIN LHE T E:AGUS ; * ; SPUN *. ONSIENSPSUS ITT ASKTAE THF OELT TOO LARGE? BGT REQA25 ;YES ASL R1 ;MAKE INDEX FOR WORD TABLES BIT PHYDEV(R1),#7400 ;IS DEVICE TYPE VALID? BNE REQA30 ;NO BIT #100000,PHYDEV(R1) ;IS DEVICE AVAILABLE? BNE REQA50 ;NO MOVB PHYDEV(R1),R1 ;GET TTY UNIT NO. FOR INDEXING TABLES MOVB R1,SYSTEM+1(R0) ;SAVE UNIT NO. IN BYTE 1 OF SYSTEM WORD CMPB TYPE(R0),#1 ;IS EXIT TYPE VALID? LEDUMOR ROERO TDECOR ROER; +2ODRMERO,OTRR#E V MO STLIN IAGFLR ROERT OUMETIT SE; ) R0R(ROERO,OTRR#E V MO . =0 O2TY TS ESDRADT IS LUTNP INTREUR CET G ; R0),R5D(TALS I OV M . = 10YOTT 20YOTT BR C ND.E B LSF OFP RIST; R01,0000#0 C BI UFGBMS FG.I SSREDD ASTLIT PUUT ONTREUR CET G ; R0),R5D(TALS O OV M T PUIN; 10YOTT Q BE ? UTNP IHOECR OUTTPOUR FOT OUE IM TIS; 3)(RRT FTSK DQRPOM =. ; RPOM'S ENTRY POINT INTO FRETSK FTSK BISB #200,-1(SP) ; SET SIGN BIT TO INDICATE ENTRY POINT FTSK BR FTKZ10 ; JUMP OVER FRETSK ENTRY POINT FTSK .ENDC FTSK ; FTSK FRETSK =. ; ENTRY POINT EV LHE TASE AM SHE T ; SPUN *ISD SE UELEV LTYRIIOPRE TH E.EUQUY ITORRI P AINK AS T ; SPUN *EDNDPEUS SLYRITAUNOL V ACELA PTOD SE UISE INUTROS HI TE:OSRPPU ; * ; * UEUE QTYRIIOPRE ARTWOF S ; * AINK AS TEDNDPEUS S ACELA P -NDSPUN: ONTICAFITIENIDM RAOGPR ; * ; *  BLT REQA35 ;NO CMPB TYPE(R0),#3 ;MAYBE BGT REQA35 ;NO MOVB LEVEL(R0),R2 ;GET REQUEST PRIORITY LEVEL FOR ;INDEXING QUEUES AND TABLES BEQ REQA05 ;IT IS A NORMAL REQUEST CMP R2,#1 ;IS IT A PRIORITY REQUEST BNE REQA40 ;NO, INVALID LEVEL REQA05 = . CLRB SYSTEM(R0) ;ZERO TASK NO. IF SYSTEM IS CALLER MOV ACTIYPTT TBTS ROZET NOS IIT; 40YOTT T BG T UNCOT EAEP RCRDE; 3)(RPTORTT CBDE .)NOT NI UINS ORR METI (TEBYG LA FROZE; FBIMOT RBCL UTTPOUT AS LARCHT GE; R1),R5R(DBTO@T VBMO R5 L AS NGXIDEINE BLTAD OR WOR F*2ITUN; 5 ,RR3 V MO E INUTRO. NT IOR FAGFLT OUMETIT SE; 3)(RAGFLTO CBIN E YT BAGFLR METIM RO FO. NITUNT GE; 3 ,RFBIMOT VBMO RSTEISEG RVESA; HRUS FTSK FSAVE =0 ; DEFAULT NUMBER OF REGISTERS SAVED FTSK .IFNZ OVRLAY ; FTSK CLRB -1(SP) ; CLEAR SIGN BIT TO INDICATE THE ENTRY FTSK FTKZ10: .ENDC FTSK .IFNZ RGSAVE ; FTSK MOV R0,-(SP) ; SAVE THE GENERAL REGISTERS FTSK MO D N P S N U ; **********************************************************************;* E AG.P SKFT . ERUSO TRNTURE; 00KEFT BR SKFT R BEUM NSKTAL GALEIL; R5 C IN: 10KEFT SKFT S TUTA SSKTAL GALEIL; R5 C IN: 20KEFT SKFT ; SKFT S ONTIVE,R3 ;GET CURRENT ACTIVE TASK HEADER ADDRESS BEQ REQA10 ;WHEN ACTIVE IS ZERO, NO TASK IS ACTIVE CLR R4 BISB TASKNO(R3),R4 ;SAVE ACTIVE TASK NO. IN BYTE 0, MOVB R4,SYSTEM(R0) ;SYSTEM WORD OF LIST INCB IOSTAT(R4) ;INCREMENT TASK I/O STATUS IN TASK TABLE REQA10 = . MOV R1,R3 ;MAKE A UNIT/LEVEL INDEX TO TABLES; I.E. ASL R3 ; INDEX = (2 * UNIT NO.) + LEVEL MOV,PR5 R JS . =O OTTY T ;T NI UTY T ;M TEYS SHE TOND UEUE QIST OUNTRI PDECOR ROERN A ; D.TEECEL SIS, LEABILVA AIF, CEVIDEY TTE ATRNTEALN A ;S PTEMTT AYSTR NERFT AEDRRCUOCT NOS HAT UPRRTEINF I ; ; --T XI EONUPS ONTIDION C ; ; TEBYG LA FERIM TUTTPOUN IEDINTAON CIS. NOT NI U ; ;- -RYNT EONUPS ONTIDION C ;; TOYOTTC, P SR J ;; --E NCUEEQ SNGLIAL C ;; !V R1,-(SP) ; FTSK MOV R2,-(SP) ; FTSK MOV R3,-(SP) ; FTSK MOV R4,-(SP) ; FTSK MOV R5,-(SP) ; FTSK FSAVE =12. ; NUMBER OF STACK WORDS USED TO SAVE FTSK .ENDC ; THE GENERAL REGISTDION CORRR EOR FREHE; SKFT ; SKFT RNTURE; PC S RT SKFT C ND.E SKFT ; R0+,P)(S V MO SKFT ; R1+,P)(S V MO SKFT ; R2+,P)(S V MO SKFT # R3,R5 ; R5 = 2*UNIT ADD R2,R3 ; R3 = 2*UNIT + LEVEL CLR ERROR(R0) ;NO LIST ERRORS, SO INIT ERROR WORD TO ;CODE FOR NO ERRORS RTS PC ;RETURN WITH ; R0 = LIST ADDRESS ; R1 = TTY UNIT NO. ; R2 = PRIORITY LEVEL OF REQUEST ; R3 = UNIT*2 + LEVEL NETIOU RUTEOIM THOECT PUINR OUTTPOUY TT- -TOYOTT ; ;; GEPA . 5 O4OI T R B P)(S,-IMWTTT # OV M ERIM TITWA UEUE;Q) SP-(),R5R(METI W OV M T OUUB RST 1UTTPOU ;5)(RBRODTT,@RO # B OV M E YP TARCHT SE ;1)(RPETYCH.,13 # B OV M S ARCHP MUAR WO. NET;G) R1N(YOTTH,UCNW # B OV M . =0 T1OI T5 O4OI T R B ) SP-(M,TITI#T V MO ERIM TSEONSPRER TORAPE OUEUE;QP)(S,-5)(RERIMIT V MO USATSTD ARBOEY KTY TET;S%ERS FTSK FTASK =FSAVE+ 4 ; STACK INDEX TO TASK# (AFTER PC,PS) FTSK FERR =FSAVE+ 4 ; STACK INDEX TO ERROR STATUS FTSK ; FTSK MOVB @#PS,-(SP) ; SAVE PS ON TOP OF STACK FTSK CLR R5 ; CLEAR ERROR REGISTER FTSK .IFZ OVRLAY ; FTSK CLR ; R3+,P)(S V MO SKFT ; R4+,P)(S V MO SKFT ; R5+,P)(S V MO SKFT S ERSTGIREL RANEGEE ORSTRE; VESARG Z FN.I SKFT USATSTR ROERT SE; ) SP2(R-ER,FR5 V MO SKFT TSUPRRTEINW LOAL; PS@#+,P)(S VBMO SKFT T INPOY TRENR ROER; ' ; R5 = UNIT*2 REQA15 = . INC (R0) ;RESTORE THREAD WORD MOVB (SP)+,PS ;RELEASE LOCKOUT MOV #ERRQL,ERROR(R0) ;SET NOT QUEUEABLE ERROR CODE RTS PC ;RETURN REQA25 = . MOV #ERRLDN,ERROR(R0) ;SET ERROR CODE FOR INVALID ;LOGICAL DEVICE NUMBER RTS PC ;RETURN REQA30 = . MOV #ERRPDT,ERROR(R0) ;SET 5)(RSRICTT,@R4 VBMO . = 20IITO T BIE BLNA EERADRET PARLE CO,;N R4 C DE ES;Y 20IITO E BN ? ERADRET PTY TOMFRT PUINS ;I 3)(R0,0040#0 T BI S IT BLEABENR RDT P &NT IRDOAYBKED OA;L 4 ,R01#1 V MO EDARLE CSR COF" IT BNEDO "ATTHE URNS;I R4),R5R(DBTI@T VBMO HOECL MAOR NOR FPETYR HA CET;S ) R1E(YPHT,C#1 VBMO CHITSWT OUUB RST 1ARLE;C 1)(RROSTFR RBCL G LA FEDEDCEEXR HA C)R0 ; CLEAR R0 FOR BYTE LOAD FTSK BISB FTASK(SP),R0 ; GET TASK NUMBER (CORE ONLY VERSION) FTSK .ENDC FTSK .IFNZ OVRLAY ; FTSK MOV FTASK(SP),R0 ; GET TASK# (OVERLAY VER. - NEED SIGN) FTSK .ENDC FTSK BEQ FTKE10 ; TASK NUMBER =0. ILLEGAL =. 00KEFT SKFT T.ENSCIEQUO TUSATSTS SKTAT SE; ) R0T(TATS RBCL SKFT P. USHNIFIO TREHE; =. 00KDFT SKFT C ND.E SKFT S PTRUERNT IUT OCKLO; S #P,@40#3 VBMO SKFT ERSTGIRER ROERT SERE; R5 R CL SKFT R BEUM NSKTAT GE; R0+,P)(S V MO SKFT +ERROR CODE FOR PHYSICAL ;DEVICE TYPE ERROR RTS PC ;RETURN REQA35 = . MOV #ERRET,ERROR(R0) ;SET ERROR CODE FOR INVALID EXIT TYPE RTS PC ;RETURN REQA40 = . MOV #ERRLEV,ERROR(R0) ;SET ERROR CODE FOR INVALID LEVEL RTS PC ;RETURN REQA50 = . BIT #040000,PHYDEV(R1) ;DOES ALTERNATE DEVICE EXIST? BEQ REQA25 ;NO AX MARLE;C ) R1H(XCMA RBCL ERNTOU CARCHE IZALTINI;I ) R3T(CNCH R CL SSREDD AERFFBUA AT DRSSE UET;G 3 ,R0)(RTADA V MO S ESDRADT IS LUTNP INTREUR CET;G 0 ,R5)(RADSTIL V MO . =0 I1OI TN URET;R 2)(R P JM . =0 O5OI T CKTA SFF ODECOR ROERP PO ; )+SP ( ST T E IMQTC, P SR J T UPRRTEINR TEINPRY TTE BLNA;E) R5R(CSTO@T0,10 # B IS B . =5 O4OI T) SP-(M,TITO#T V MO -. FTSK .IFNZ OVRLAY ; FTSK BPL FTKZ20 ; NOT A DQRPOM CALL. CARRY ON. FTSK MOV R3,R1 ; GET HEADER ADD. AS I NEED IT FROM RPOMFTSK MOVB R4,R2 ; GET PRIORITY LEVEL AS I NEED IT. FTSK BR FTKZ30 ; JUMP AROUND CHECKS - ALREADY DONE FTSK FTKZ20: .ENDC FTSK CMPB R0,TAS M PO RLLCA; Y VLQO,DPC R JS SKFT ERMBNUK AS TSHPU; P)(S,-R0 V MO SKFT R TELAR FOK ACSTN OERMBNUK AS TVESA; P)(S,-R0 V MO SKFT TSUPRRTEINW LOAL; S #P,@P)(S VBMO SKFT . UEAL V'SOMRPO TUSATSTT SE; ) R0T(TATS.,#8 VBMO SKFT ; AYRLOV Z FN.I SKFT OMRPL AL CTOY NL OREHE; / MOV ALTDEV(R1),R1 ;GET ALTERNATE DEVICE NO. BR REQA02 ;GO LOOK AT ALTERNATE DEVICE .PAGE ; ; ; QLIST -- SUBROUTINE TO QUEUE TTY REQUEST LIST TO ; THE APPROPRIATE DEVICE/LEVEL QUEUE ; ; CALLING SEQUENCE -- ; ; JSR PC,QLIST ; ; CONDITIONS UPON ENTRY -- ; ; R0 CONTAINS ADDRESS OF LIST TO BE QUEUED ; R1 CONTAINS UNIT NO. ; R2 CONTAINS LEVEL ; ITUNR FOR METIT PUUT OUEUE Q ;P)(S,-5)(RERIMOT V MO G MSF OARCHT 1ST PUUT;O 5)(RBRODTT,@R4 VBMO . = 42IOTO ES;Y) R1E(YPHT,C0.#1 VBMO O ;N 42IOTO E BN R C AITS ;I CR,#R4 PBCM SG MOFR HA CST 1ET;G 4 ,R4)(RATGDMS VBMO ERNTOU CARCHE IZALTINI;I ) R4T(CNCH R CL . =0 O4OI TS ESDRADR FEUF BTADAS ERUST GE ; R4),R0A(AT D OV M . = 30IOTO DCEN . 0 O4OI T R 1KS ; IS THE TASK# > LARGEST LEGAL NUMBER FTSK BHI FTKE10 ; YES. FTSK ASL R0 ; MAKE INTO WORD INDEX FTSK MOV HEADER(R0),R1 ; GET HEADER ADDRESS FTSK ASR R0 ; RESET R0 FTSK MOVB #340,@#PS ; LOCK OUT ALL INTERRUPTS FTSK MOVB TSTAT(R0),R2 ; GET THE STATUS OF THE TASK =. 00KCFT SKFT E OM HGO; 00KDFT BR SKFT D.REEACLE ARR TEINPOK ACSTE THD AN; 1)(RCKTATS R CL SKFT ELEV LPU CNTREUR CR,METIT ENRRCU; ) R1T(USCP RBCL ; SKFT HE TS,SKTAT ENIDES RRECOR FO; 1)(RERIMCT R CL ; SKFT R TELAR METI CND ASTPU CEDNEY MA; SKFT C ND.E SKFT K OR WDO3 R4 CONTAINS 0 FOR OUTPUT, 2 FOR INPUT REQUEST LISTS ; ; CONDITIONS UPON EXIT -- ; ; R4 CONTAINS 2*(4*UNIT + LEVEL + X) ; WHERE X = 0 FOR OUTPUT ; 2 FOR INPUT ; QLIST = . JSR PC,GETQX ;GET Q TABLE POINTER TO R4 JSR PC,LOCOUT ;LOCKOUT INTERRUPTS MOV R0,@QLAST(R4) ;QUEUE LIST POINTED TO BY R0 MOV R0,QLAST(R4) MOVB (SP)+,PS ;R B T IS LSTPAR TEINPOE OV;M R4A,AT#D D AD STLIF ONGNIINEG BTOR TEINPOT GE ; R40, R OV M B LSF OFP RIST ; 0 R EC D R FEUF BRSSE UINS ITADA, NO ; 0 O3OI T EQ B R?FEUF BNGKIOR WINT IS LIS ; 0 ,R010000 # IT B F BUSG M G IF . S ESDRADT IS LUTTPOUT ENRRCUT GE ; R0),R5D(TALS O OV M T PUUT OOR FPETYR HA CET;S 1)(RPETYCH RBCL . =0 O2OI TS YE ; 0 I1OI T EQ B 5 FTSK DEC R2 ; IS STATUS =1? FTSK .IFNZ OVRLAY ; ONLY TEST RPOM'S STATUS IF HAVE FTSK BEQ FTKC00 ; OVERLAYS FTSK .ENDC FTSK DEC R2 ; IS THE STATUS 2? FTSK BEQ FTKA00 ; YES. FTSK SUB #2,R2 M PO RET LGO; 00KCFT ISBH SKFT K?AS TAYRLVE OANS HI TIS; INTMOV,#R0 PBCM SKFT . IST IIFE OM HGO; 00KEFT I BM SKFT L AL COMRPDQA R FOK ECCH; R0 T TS SKFT ; AYRLOV Z FN.I SKFTK.AS TEDNDPEUS S AOFE AR CKETAO TREHE; =. 00KBFT SKFT E)BLUAUE(Q 1TOD OR WADRETHT SE; ) R1,(#1 V MO: 407ELEASE LOCKOUT RTS PC ;RETURN .PAGE ; ; ; DQLIST -- SUBROUTINE TO DEQUEUE THE TTY REQUEST LIST ; CURRENTLY ON TOP OF THE APPROPRIATE ; DEVICE/LEVEL QUEUE ; ; CALLING SEQUENCE -- ; ; JSR PC,DQLIST ; ; CONDITIONS UPON ENTRY -- ; ; R1 CONTAINS UNIT NO. ; R2 CONTAINS LEVEL ; R4 CONTAINS 0 OR 2 FOR OUTPUT OR INPUT REQUEST LISTS, ; ? EDATTINI IBEO TUTNP IIS ; ) R1T(PRTY T B ST T CHITSWT OUMETIT 1SR EACL ; ) R1O(TTRS F B LR C 4)(RTRCN,TIMWTTT # B OV M ERIM TITWAT SERE ; R4),R5R(METI W OV M NO ; 0 T1OI T GT B N? OEDRNTUT NI UIS ; 1)(RONTY T B ST T T NI UOR FNTOU CATPERET SE ;1)(RPTORTTS,RYNT # B OV M K ACSTP POD ANS ESDRADN URET RET;G R2+,P)(S V MO . =T NIOI T; EDORSTRET NOD AND SE URE AR43,,RR2 ; O.9 ; IS IT 4? FTSK BEQ FTKB00 ; YES FTSK .IFNZ OVRLAY ; FTSK DEC R2 ; ONLY CHECK FOR 5 IF HAVE FTSK BEQ FTKB00 ; OVERLAYS. FTSK .ENDC FTSK BR FTKE20 ; ALL OTHER STATUS VALUES ARE ILLEGAL KAFT SKFT Y.ARSSCENEF ISTLAT SERED AN; ) R4T(AS,LR4 V MO SKFT RDWOD EAHR TKSAS TUSIOEVPRO NT IRDWO; 40KAFT E BN SKFT D EAHR T'SSKTAS HI TOFS NTTEON CVEMO; ) R4,(1)(R V MO: 30KAFT SKFT D OR WADRETHT SEREO GENTH; 40KAFT BR SKFT STIR FTO; ) R2T(AS,LR2 D AD SKFT T INPOO TSTLAT SERE, SEELG INTHNO; ) R2T(AS,LSTIR#F V MO SKFT . EUQUE THN IISE LS ENG; RESPECTIVELY ; ; CONDITIONS UPON EXIT -- ; ; R4 CONTAINS 2*(4*UNIT + LEVEL + X) ; WHERE X = 0 FOR OUTPUT ; = 2 FOR INPUT ; DQLIST = . MOV R0,-(SP) ;SAVE REGISTER JSR PC,GETQX ;GET Q TABLE POINTER TO R4 JSR PC,LOCOUT ;LOCKOUT INTERRUPTS MOV @QFIRST(R4),R0 ;DEQUEUE LIST POINTED TO BY QFIRST MOV #1,@QFIRST(R4) MOV R0, NITUN2*S INTAON CR5 ; O. NITUNS INTAON CR1 ; SSREDD ASTLIS INTAON CR0 ; ;- -ITEXN PO UNSIOITNDCO ; ; LYULTFECSPRET PUUT OORT PUINR FO1 R O 0NSAINTCOT PRTY T ;S ESDRADT IS LUTNP INTREUR CNSAINTCOD TALS I ; SSREDD ASTLIT PUUT ONTREUR CNSAINTCOD TALS O ;T NI*U 2NSAINTCO5 R ;. NOT NI UHE TNSAINTCO1 R ;K ACSTN OPCE OVABS IPSD ANT OUD KEOC LRE APSRUERNT I = FTSK FTKA00 =. ; HERE TO DEQUEUE A TASK. FTSK MOVB #8.,TSTAT(R0) ; SET STATUS TO PREVENT DISPATCHING FTSK MOVB (SP),@#PS ; ALLOW INTERRUPTS FTSK MOVB HPRIOR(R1),R2 ; GET PRIORITY LEVEL TO SEARCH FTSK FTKZ30: ASL R2 ; SHIFT INTO WORD INDEX FTSK MOV FIRST(R2),R3 ; GET ADDRESS OF FIRST ENTRY IN QUEUE FTSK BEQ FTKE20 ; HIYTAN; 40KAFT E BN SKFT IFE SEN HE TT,RSFIT SERE S.YE; 2)(RSTIR,F1)(R V MO SKFT T.NOF ICHANBR E.EUQU; 30KAFT E BN SKFTE THN I 1O. NSKTAR TEAFT GHOU SHE TIS; 2)(RSTIR,FR3 P CM SKFT R ROER. NO; 20KEFT Q BE SKFT ? UEUE QHE TINL ILSTK AS TIS; 1 ,#1)(R P CM SKFT TSUPRRTEINT OUK OC LTOT SERE; S #P,@40#3 VBMO: 20KAFT ?QFIRST(R4) BNE DQLI10 ;WAS IT THE END OF THE THREAD MOV R4,R0 ;YES ADD #QFIRST,R0 ;GET QFIRST TABLE ADDRESS MOV R0,QLAST(R4) DQLI10 = . MOVB (SP)+,PS ;RELEASE LOCKOUT MOV (SP)+,R0 ;RESTORE REGISTER RTS PC ;RETURN .PAGE ; ; ; GETQX -- SUBROUTINE TO CONSTRUCT POINTER FOR INDEXING ; QFIRST AND QLAST TABLES ; ; CALHIYTAN; 40KAFT E BN SKFT IFE SEN HE TT,RSFIT SERE S.YE; 2)(RSTIR,F1)(R V MO SKFT T.NOF ICHANBR E.EUQU; 30KAFT E BN SKFTE THN I 1O. NSKTAR TEAFT GHOU SHE TIS; 2)(RSTIR,FR3 P CM SKFT R ROER. NO; 20KEFT Q BE SKFT ? UEUE QHE TINL ILSTK AS TIS; 1 ,#1)(R P CM SKFT TSUPRRTEINT OUK OC LTOT SERE; S #P,@40#3 VBMO: 20KAFT TASK NOT FOUND IN QUEUE FTSK FTKA10: CMP R1,R3 ; IS THIS THE TASK WE SEEK? FTSK BEQ FTKA20 ; YES. FTSK MOV R3,R4 ; SAVE THIS ADDRESS IN R4 FTSK MOV (R3),R3 ; GET NEXT ADDRESS IN THE THREAD FTSK BNE FTKA10 ; IF MORE LEFT, GO CHECK. FTSK BR FTKE20 ; NONE LEFT. TASK NOT FOUND. FTSK ;; --Y TRENN PO UNSIOITNDCO ; ITINTOC, P SR J ;; --E NCUEEQ SNGLIAL C ;; UTTPOUR OUTNP IZELIIAITINO TNETIOUBRSU- -ITINTO ; ;; GEPA . 4 RINX DEINH IT WRNTURE ; C P TS R R TEISEG RRETOES;R R1+,P)(S V MO R4 L AS R41, R DD A 1 ,RR2 D AD X)+ L VELE+ T NI*U(42* ; R1 L AS EXND ICTRUSTON;C R1 L AS ERSTGIREE AV;S LING SEQUENCE -- ; ; JSR PC,GETQX ; ; CONDITIONS UPON ENTRY -- ; ; R1 CONTAINS UNIT NO. ; R2 CONTAINS LEVEL ; R4 CONTAINS 0 OR 2 FOR OUTPUT OR INPUT RESPECTIVELY ; ; CONDITIONS UPON EXIT -- ; ; R4 CONTAINS INDEX TO Q TABLES (2*(4*UNIT + LEVEL + X) ; WHERE X = 0 FOR OUTPUT QUEUES ; = 2 FOR INPUT QUEUES ; GETQX = . MOV R1,-(SP)