.TITLE VTTAB .IDENT /V1.12/ ;******************************************************************** ; ; DATA STRUCTURES FOR VIRTUAL TERMINAL DRIVER. ; FOR USE BY BATCH SYSTEM. ; VT0: IS THE EXCLUSIVE PROPERTY OF THE BATCH SYSTEM MANAGER. ; OTHER VT:'S REPRESENT THE BATCH STREAMS. ; VT0: IS ON CONTROLLER #1. ; OTHER VT:'S ARE ON CONTROLLER #2. ; ; THE UNIT CONTROL BLOCKS (UCBS) FOR THE VIRTUAL TERMINALS ARE SOMEWHAT ; LONGER THAN THOSE FOR NORMAL TERMINALS. THE ADDITIONAL OFFSETS INVOLVED ; ARE GLOBALLY DEFINED IN THIS MODULE. ; ; S.M. THOMPSON, JANUARY 1980 (V1.0 AUGUST 1979) ; ; ; SMT 12-APR-82 MODS. SO IT WILL WORK ON V3.2 OR V4.0 ; ;********************************************************************* NVT = 4 ; THIS IS THE NUMBER OF BATCH STREAMS THAT ; CAN BE ACTIVE SIMULTANEOUSLY. THE VALUE ; SPECIFIED CAN BE FROM 1 TO 4. DATA BASES ; ARE INCLUDED FOR VT:'S. BUFSIZ = 132. ; INITIAL BUFFER SIZE (SET /BUF=VTN:) QUEMAX = 15. ; MAXIMUM QUEUE SIZE LD$VT=1 ; LOADABLE DRIVER IF THIS SYMBOL ; IS DEFINED .IIF LE NVT .ERROR ; INVALID NUMBER OF VT:'S (TOO LOW) .IIF GT .ERROR ; INVALID NUMBER OF VT:'S (TOO HIGH) .SBTTL DEVICE CONTROL BLOCK $USRTB:: $VTDAT:: ; START OF DATA BASE ;+ ; ; DEVICE CONTROL BLOCK, GLOBALLY LABELLED $VTDCB ; ;- $VTDCB:: ; GLOBAL LABEL FOR DCB .WORD 0 ; LINK TO NEXT DCB (0=LAST) .WORD $VIRT0 ; LINK TO FIRST UCB .ASCII /VT/ ; VIRTUAL TERMINAL DEVICE NAME .BYTE 0 ; LOWEST UNIT NUMBER .BYTE NVT ; HIGHEST UNIT NUMBER .WORD $VIRTL ; UCB LENGTH .IF DF LD$VT .WORD 0 ; POINTER TO DRIVER DISPATCH TABLE .IFF .WORD $VTTBL .ENDC .WORD 160037 ; LEGAL FUNCTION MASK CODES 0-15 ; IO.ACE (ACCESS FILE FOR EXTEND) ; IO.ACW (ACCESS FILE FOR WRITE) ; IO.ACR (ACCESS FILE FOR READ) ; IO.ATT (ATTACH DEVICE) ; IO.DET (DETACH DEVICE) ; IO.KIL (CANCEL I/O) ; IO.WLB (WRITE LOGICAL BLOCK) ; IO.RLB (READ LOGICAL BLOCK) .WORD 30 ; CONTROL FUNCTION MASK CODES 0-15 ; IO.ATT (ATTACH DEVICE) ; IO.DET (DETACH DEVICE) .WORD 160000 ; NO OP'ED FUNCTION MASK CODES 0-15 ; IO.ACE (ACCESS FILE FOR EXTEND) ; IO.ACW (ACCESS FILE FOR WRITE) ; IO.ACR (ACCESS FILE FOR READ) .WORD 0 ; ACP FUNCTION MASK CODES 0-15 .WORD 7 ; LEGAL FUNCTION MASK CODES 16-31 ; IO.WVB (WRITE VIRTUAL BLOCK) ; IO.RVB (READ VIRTUAL BLOCK) ; IO.DAC (DEACCESS FILE) .WORD 0 ; CONTROL FUNCTION MASK CODES 16-31 .WORD 1 ; NO OP'ED FUNCTION MASK CODES 16-31 ; IO.DAC (DEACCESS FILE) .WORD 6 ; ACP FUNCTION MASK CODES 16-31 ; IO.RVB (READ VIRTUAL BLOCK) ; IO.WVB (WRITE VIRTUAL BLOCK) .IF DF L$$DRV .WORD 0 ; LOADABLE DRIVER PCB ADDRESS .ENDC .PAGE .SBTTL UNIT CONTROL BLOCK 0 ;+ ; ; UNIT CONTROL BLOCK 0, GLOBALLY LABELLED $VIRT0 ; ;- VTST=. U.JPKT==. .WORD 0 ; BATCH JOB PACKET ADDRESS U.STSZ==. .WORD 0 ; CURRENT STACK SIZE ; FOR VT0:, THESE FIELDS HAVE OTHER USES. ; SEE COMMENTS CONCERNING "$CURJ" BELOW. U.STHD==. .WORD 0 ; STACK LISTHEAD .WORD .-2 ; .IF EQ .WORD 0 .IFF .WORD $MCRPT ; .ENDC .WORD 0 ; LOGON UIC .WORD 0 ; OWNING TERMINAL UCB ADDRESS $VIRT0:: U.JPKT==U.JPKT-. U.STSZ==U.STSZ-. U.STHD==U.STHD-. .WORD $VTDCB ; BACKPOINTER TO DCB .WORD .-2 ; POINTER TO REDIRECT UNIT UCB .BYTE 0 ; CONTROL FLAGS BYTE .BYTE 0 ; UNIT STATUS BYTE .BYTE 0 ; PHYSICAL UNIT NUMBER .BYTE 0 ; 2ND STATUS BYTE .WORD DV.REC!DV.CCL!DV.TTY ; FIRST CHARACTERISTICS WORD .IF DF M$$MUP .IFF .WORD U2.PRV ; 2ND CHARACTERISTICS WORD .IFT .IF GT M$$MUP+1 .WORD U2.LOG ; TERMINAL STARTS OFF LIFE LOGGED OFF .IFF .WORD U2.PRV .IFTF M$$MUP=M$$MUP+1 .ENDC .ENDC .WORD 0 ; 3RD CHARACTERISTICS WORD .WORD BUFSIZ ; 4TH CHARACTERISTICS WORD .WORD $VTS0 ; POINTER TO STATUS CONTROL BLOCK .WORD 0,0,0,0,0,0,0,0,0,$BTMSK+1,0,0,100200,0 .IIF DF T$$ACR!T$$BTW!T$$CCA!T$$CCO!T$$ESC!T$$HLD, T1=0 .IF DF T1!T$$RPR!T$$SYN!T$$TRW!T$$UTB!T$$30P .WORD 0 .ENDC .IF DF T$$CCA&A$$TRP .WORD 0 .ENDC .IF DF T$$ESC .WORD 0 .ENDC VTND=. $VIRTL==VTND-VTST .PAGE .SBTTL UNIT CONTROL BLOCK 1 ;+ ; ; UNIT CONTROL BLOCK 1, GLOBALLY LABELLED $VIRT1 ; ;- .WORD 0 .WORD 0 .WORD 0 .WORD .-2 .IF EQ .WORD 0 .IFF .WORD $MCRPT ; .ENDC .WORD 0 .WORD 0 $VIRT1:: .WORD $VTDCB .WORD .-2 .BYTE 0,0 .BYTE 1,0 .WORD DV.REC!DV.CCL!DV.TTY .IF DF M$$MUP .IFF .WORD U2.PRV .IFT .IF GT M$$MUP+1 .WORD U2.LOG .IFF .WORD U2.PRV .IFTF M$$MUP=M$$MUP+1 .ENDC .ENDC .WORD 0 .WORD BUFSIZ .WORD $VTS1 .WORD 0,0,0,0,0,0,0,0,0,$BTMSK+1,0,0,100200,0 .IIF DF T$$ACR!T$$BTW!T$$CCA!T$$CCO!T$$ESC!T$$HLD, T1=0 .IF DF T1!T$$RPR!T$$SYN!T$$TRW!T$$UTB!T$$30P .WORD 0 .ENDC .IF DF T$$CCA&A$$TRP .WORD 0 .ENDC .IF DF T$$ESC .WORD 0 .ENDC .PAGE .SBTTL UNIT CONTROL BLOCK 2 ;+ ; ; UNIT CONTROL BLOCK 2, GLOBALLY LABELLED $VIRT2 ; ;- .IF GT NVT-1 .WORD 0 .WORD 0 .WORD 0 .WORD .-2 .IF EQ .WORD 0 .IFF .WORD $MCRPT ; .ENDC .WORD 0 .WORD 0 $VIRT2:: .WORD $VTDCB .WORD .-2 .BYTE 0,0 .BYTE 2,0 .WORD DV.REC!DV.CCL!DV.TTY .IF DF M$$MUP .IFF .WORD U2.PRV .IFT .IF GT M$$MUP+1 .WORD U2.LOG .IFF .WORD U2.PRV .IFTF M$$MUP=M$$MUP+1 .ENDC .ENDC .WORD 0 .WORD BUFSIZ .WORD $VTS1 .WORD 0,0,0,0,0,0,0,0,0,$BTMSK+1,0,0,100200,0 .IIF DF T$$ACR!T$$BTW!T$$CCA!T$$CCO!T$$ESC!T$$HLD, T1=0 .IF DF T1!T$$RPR!T$$SYN!T$$TRW!T$$UTB!T$$30P .WORD 0 .ENDC .IF DF T$$CCA & A$$TRP .WORD 0 .ENDC .IF DF T$$ESC .WORD 0 .ENDC .ENDC ; GT NVT-1 .PAGE .SBTTL UNIT CONTROL BLOCK 3 ;+ ; ; UNIT CONTROL BLOCK 3, GLOBALLY LABELLED $VIRT3 ; ;- .IF GT NVT-2 .WORD 0 .WORD 0 .WORD 0 .WORD .-2 .IF EQ .WORD 0 .IFF .WORD $MCRPT ; .ENDC .WORD 0 .WORD 0 $VIRT3:: .WORD $VTDCB .WORD .-2 .BYTE 0,0 .BYTE 3,0 .WORD DV.REC!DV.CCL!DV.TTY .IF DF M$$MUP .IFF .WORD U2.PRV .IFT .IF GT M$$MUP+1 .WORD U2.LOG .IFF .WORD U2.PRV .IFTF M$$MUP=M$$MUP+1 .ENDC .ENDC .WORD 0 .WORD BUFSIZ .WORD $VTS1 .WORD 0,0,0,0,0,0,0,0,0,$BTMSK+1,0,0,100200,0 .IIF DF T$$ACR!T$$BTW!T$$CCA!T$$CCO!T$$ESC!T$$HLD, T1=0 .IF DF T1!T$$RPR!T$$SYN!T$$TRW!T$$UTB!T$$30P .WORD 0 .ENDC .IF DF T$$CCA & A$$TRP .WORD 0 .ENDC .IF DF T$$ESC .WORD 0 .ENDC .ENDC ; GT NVT-2 .PAGE .SBTTL UNIT CONTROL BLOCK 4 ;+ ; ; UNIT CONTROL BLOCK 4, GLOBALLY LABELLED $VIRT4 ; ;- .IF GT NVT-3 .WORD 0 .WORD 0 .WORD 0 .WORD .-2 .IF EQ .WORD 0 .IFF .WORD $MCRPT ; .ENDC .WORD 0 .WORD 0 $VIRT4:: .WORD $VTDCB .WORD .-2 .BYTE 0,0 .BYTE 4,0 .WORD DV.REC!DV.CCL!DV.TTY .IF DF M$$MUP .IFF .WORD U2.PRV .IFT .IF GT M$$MUP+1 .WORD U2.LOG .IFF .WORD U2.PRV .IFTF M$$MUP=M$$MUP+1 .ENDC .ENDC .WORD 0 .WORD BUFSIZ .WORD $VTS1 .WORD 0,0,0,0,0,0,0,0,0,$BTMSK+1,0,0,100200,0 .IIF DF T$$ACR!T$$BTW!T$$CCA!T$$CCO!T$$ESC!T$$HLD, T1=0 .IF DF T1!T$$RPR!T$$SYN!T$$TRW!T$$UTB!T$$30P .WORD 0 .ENDC .IF DF T$$CCA & A$$TRP .WORD 0 .ENDC .IF DF T$$ESC .WORD 0 .ENDC .ENDC ; GT NVT-3 .PAGE .SBTTL STATUS CONTROL BLOCK, CONTROLLER #1 ;+ ; ; STATUS CONTROL BLOCK FOR VT0: ; SCB IS GLOBALLY LABELLED $VTS0 ; ;- $VTS0:: .WORD 0 ; I/O PACKET LISTHEAD .WORD .-2 .BYTE 0,0 ; NO INTERRUPTS .BYTE 0,0 ; NO TIMEOUTS .BYTE 0 ; CONTROLLER INDEX .BYTE 0 ; CONTROLLER STATUS BYTE .WORD 0 ; CSR ADDRESS .WORD 0 ; I/O PACKET ADDRESS .WORD 0,0,0,0 ; FORK BLOCK .IF DF L$$DRV & M$$MGE .WORD 0 .ENDC .PAGE .SBTTL STATUS CONTROL BLOCK, CONTROLLER #2 ;+ ; ; STATUS CONTROL BLOCK FOR VT1:,VT2:..... ; SCB IS GLOBALLY LABELLED $VTS1 ; ;- $VTS1:: .WORD 0 .WORD .-2 .BYTE 0,0 .BYTE 0,0 .BYTE 2,0 .WORD 0 .WORD 0 .WORD 0,0,0,0 .IF DF L$$DRV & M$$MGE .WORD 0 .ENDC .PAGE .SBTTL ADDITIONAL DATA STRUCTURES ;+ ; ; ADDITIONAL DATA STRUCTURES REQUIRED BY BATCH SYSTEM ; ;- $NUMQ==$VIRT0+U.STSZ ; NUMBER OF JOBS IN QUEUE ; THIS FIELD SHARES STORAGE WITH ; THE UCB FOR VT0:, SINCE THE BATCH ; SYSTEM DOES NOT START JOBS ON THIS ; UNIT, BUT MERELY USES IT FOR INPUT. ; THIS COMMENT ALSO APPILES TO $CURJ ; AND $QSTAT BELOW. $CURJ==$VIRT0+U.STHD ; EXECUTING JOBS LISTHEAD $QSTAT==$VIRT0+U.JPKT ; QUEUE STATUS WORD $QUEHD::.WORD 0 ; BATCH QUEUE LIST HEAD FOR NORMAL JOBS .WORD .-2 ; $EXPRQ::.WORD 0 ; EXPRESS QUEUE LISTHEAD .WORD .-2 ; $HOLDQ::.WORD 0 ; HOLD QUEUE LISTHEAD .WORD .-2 ; $JOBN:: .WORD 0 ; NUMBER OF LAST JOB SUBMITTED $MAXQ:: .WORD QUEMAX ; MAXIMUM QUEUE SIZE $VTEND:: .END