IDENT 1TO,ITO
PERIPH
BASE MIXED
SST
*COMMENT 1TO - TERMINAL INPUT/OUTPUT.
COMMENT COPYRIGHT CONTROL DATA SYSTEMS INC. 1992.
TITLE 1TO - TERMINAL INPUT/OUTPUT.
SPACE 4
*** 1TO - TERMINAL INPUT/OUTPUT.
*
* R. E. TATE. 70/09/13.
* L. G. ALEXANDER. 77/04/01.
* A. J. KOMOR. 77/11/01.
* L. K. TUTTLE 81/11/02.
SPACE 4
*** 1TO IS CALLED BY *IAF* TO PROCESS A QUEUE OF
* REQUESTS FOR TERMINAL INPUT AND OUTPUT WHICH REQUIRE
* DISK ACCESSES. THE QUEUE PASSED TO *1TO* IS SORTED IN
* ORDER OF REQUEST TYPE, INPUT FIRST. *1TO* WILL ACCESS THE
* EJT TO OBTAIN DISK INFORMATION. REQUESTS OF EACH
* TYPE ARE THEN PROCESSED BY EQUIPMENT AND TRACK TO
* MINIMIZE DISK TIME. IF THERE ARE REQUESTS FOR MORE THAN
* ONE MASS STORAGE DEVICE, THE ENTRIES ARE PROCESSED ON
* A DEVICE BASIS IN ORDER OF AVAILABLE CHANNELS.
*
* *1TO* MAY ALSO BE CALLED BY *1RO* TO PROCESS THE
* FIRST BUFFER OF DATA ON A ROLLOUT.
*
* UPON *1TO* COMPLETION, THE REQUEST QUEUE IS
* RETURN TO IAF. THE UPDATED POT POINTERS IN
* IT ARE USED TO DROP DUMPED SOURCE INPUT POTS, AND TO
* ASSIGN FILLED OUTPUT DATA POTS.
SPACE 4,20
*** CALL.
*
*
* FROM *IAF* -
*
*T 18/ *1TO*,6/ CP,12/ PP,6/ ,18/ RETURN ADDRESS
*
* CP IAF CONTROL POINT NUMBER.
* PP POT POINTER TO FIRST POT OF REQUESTS.
*
*
* CALL FROM *1RO*.
*
* 18/ *1TO*,6/ CP,24/ 0,12/ TN
*
* CP IAF CONTROL POINT NUMBER.
* TN TERMINAL NUMBER / APPLICATION CONNECTION NUMBER.
SPACE 4,20
*** *IAF* REQUEST QUEUE FORMAT.
*
*
* FORMAT WHEN CALLED.
*
*T, 6/ FT,6/ RT,12/ EJTO,12/ NP,12/ FP,12/ TN
*
* FT FILE TYPE.
* 0 = PRIMARY FILE.
* 1 = ROLLOUT FILE.
* RT REQUEST TYPE.
* 0 = DUMP INPUT TO PRIMARY FILE.
* 1 = OUTPUT TO TERMINAL.
* EJTO EJT ORDINAL OF JOB.
* NP NUMBER OF POTS TO DUMP TO PRIMARY FILE (INPUT).
* FP FIRST POT FOR EITHER INPUT OR OUTPUT.
* TN TERMINAL NUMBER / APPLICATION CONNECTION NUMBER.
*
* THE REQUEST UNDERGOES SIGNIFICANT CHANGE IN PRESET.
* THE ENTRY AND EXIT FORMATS FOR PRESET ARE FOUND IN PRESET
* HEADER DOCUMENTATION.
*
*
* FORMAT ON TERMINATION -
*
*T 6/ RT,6/ NP,12/ 0,12/ LP,12/ FP,12/ TN
*
* RT REQUEST TYPE.
* NP NUMBER OF POTS FILLED (OUTPUT ONLY).
* LP LAST POT TO DROP OR ASSIGN (0 IF NONE TO DROP).
* FP FIRST POT OF INPUT OR FOR OUTPUT (0 IF NONE TO DROP).
* TN TERMINAL NUMBER / APPLICATION CONNECTION NUMBER.
TEPS SPACE 4,10
** TEPS - TABLE OF ENTRY POINTERS (SORTED).
*
* EACH ENTRY CONSISTS OF TWO BYTES -
* THE FIRST BYTE CONTAINS THE POINTER TO THE REQUEST IN EBUF.
* THE SECOND BYTE CONTAINS
* FOR INPUT - THE SECTOR NUMBER OF THE CURRENT EOI.
* FOR OUTPUT - THE WORD COUNT IN THE CURRENT SECTOR.
SPACE 4,10
** ABORT CONDITIONS.
*
* *1TO* WILL ABORT *IAF* IF THE FOLLOWING CONDITIONS ARE
* ENCOUNTERED. A DAYFILE MESSAGE * 1TO ABORT NN, PPPP.* WILL
* BE ISSUED WHERE *NN* = ERROR CODE AND *PPPP* = PARAMETER
* POT POINTER.
*
* INPUT REQUESTS AFTER OUTPUT REQUESTS FROM IAF. (NN = 1)
* NO REQUESTS IN THE QUEUE. (NN = 2)
* REQUEST FOR A NON - MASS STORAGE DEVICE. (NN = 3)
* *UTEM* REJECT OR UNEXPECTED EJT STATUS. (NN = 4)
* ENTRY COUNT LOST WHILE SORTING QUEUE. (NN = 5)
* PC = 0 ON SOURCE DUMP. (NN = 6)
* PP = 0 ON OUTPUT REQUEST. (NN = 7)
SPACE 4
** ASSEMBLY VARIABLES FOR DEFINITION COMMON DECKS.
WEI$ EQU 1 DEFINE VARIABLE BUFFER (FOR *COMPWEI*)
SPACE 4
** DEFINITION COMMON DECKS.
SPACE 4
*CALL,COMPMAC
*CALL COMSEJT
*CALL,COMSMSP
*CALL COMSJRO
*CALL COMSPIM
*CALL,COMSREM
*CALL COMSTCM
*CALL COMSWEI
SPACE 4
**** DIRECT LOCATION ASSIGNMENTS.
SPACE 2
S3 EQU 17 SCRATCH CELL
FS EQU 20 - 24 FILE STATUS BYTES (5 LOCATIONS)
CN EQU 25 - 31 TERMINAL TABLE VROT WORD (5 LOCATIONS)
TN EQU 32 TERMINAL NUMBER
TT EQU 33 - 34 TERMINAL TABLE ADDRESS (2 LOCATIONS)
CT EQU 35 POT LENGTH
SC EQU 36 NUMBER OF WORDS IN CURRENT SECTOR
LW EQU 41 LAST WORD IN PREVIOUS SECTOR
S2 EQU 42 SCRATCH CELL (OUTPUT PROCESSING)
LN EQU 43 - 47 LINE NUMBER (5 LOCATIONS)
IN EQU LN INPUT REQUEST COUNTER (PRS)
OT EQU LN+1 OUTPUT REQUEST COUNTER (PRS)
EC EQU LN+2 ENTRY COUNT (PRS)
NW EQU 50 USER BLOCKSIZE IN CM WORDS.
WL EQU 51 NUMBER OF WORDS OF OUTPUT IN BUFFER.
PP EQU 52 POT POINTER
PL EQU 53 LENGTH OF LAST POT
S1 EQU PL SCRATCH CELL
PC EQU 54 NUMBER OF POTS TO BE DUMPED
PA EQU 60 - 61 POT ADDRESS (2 LOCATIONS)
BC EQU 62 BUFFER COUNT
BA EQU 63 CURRENT FWA OF BUFFER
EP EQU 64 CURRENT ENTRY POINTER
CB EQU 65 CONTROL BYTE INDEX
WC EQU 66 WORD COUNT (POSITION) IN CURRENT SECTOR
****
EJECT
1TO TITLE MAIN ROUTINE.
** 1TO - MAIN ROUTINE.
*
* THIS ROUTINE PROCESSES A LIST OF REQUESTS ON ONE OR MORE
* EQUIPMENTS. IF MORE THAN ONE EQUIPMENT IS PRESENT ALL
* LIST ENTRIES ARE SEARCHED FOR THE ONE WITH THE SMALLEST
* DEVICE ACTIVITY. ONCE THIS SELECTION IS MADE THE
* INPUT/OUTPUT OPERATION IS PERFORMED AND THE CHANNEL IS
* RELEASED. FINALLY THE ENTRY PROCESSING IS COMPLETED BY
* EITHER TERMINATING THE SOURCE PROCESSING (IF INPUT
* PROCESSING) OR FILLING POTS (IF OUTPUT PROCESSING).
* AFTER ALL ENTRIES IN THE LIST HAVE BEEN PROCESSED *IAF*
* IS SENT NOTIFICATION THAT ALL ENTRIES ARE COMPLETE.
ORG PPFW
ITO LJM PRS PRESET
ITO1 LDM ITOB REMAINING INPUT REQUESTS
ADN 0 2TO LOADED FLAG
ITOA EQU *-1
NJN ITO2 IF LOADING NOT NECESSARY
RJM DRC DROP RESERVED CHANNEL
EXECUTE 2TO
AOM ITOA SET 2TO LOADED
LDN 0 SET NO EQUIPMENT
STD T5
ITO2 RJM CKN CHECK NEXT EQUIPMENT
ZJN ITO3 IF SAME EQUIPMENT
RJM CUA CHECK UNIT ACTIVITY
* PROCESS ENTRY.
ITO3 SETMS IO,(ND)
LDM 4,EP SET TERMINAL NUMBER
STD TN
RJM STA SET TERMINAL TABLE ADDRESS
ADN VROT
CRD CN *VROT*
LDM 3,EP SET POT POINTER
STD PP
LDM 1,EP SET TRACK
STD T6
STD FS+2
LDM 2,EP SET SECTOR
STD T7
STD FS+3
LDM CKNB SET EXTRA PARAMETER
STD T1
LDM 1,T1
STD WC
LDC 0 CHECK INPUT REQUEST COUNT
ITOB EQU *-1
ZJN ITO4 IF NO INPUT REQUESTS REMAINING
LDD WC SET CURRENT EOI
STD T7
RJM IDP INPUT DATA PPOCESSING
SOM ITOB DECREMENT INPUT REQUEST COUNT
LDN 0 SET INPUT REQUEST PROCESSED
UJN ITO5 CONTINUE PROCESSING QUEUE
ITO4 RJM /2TO/ODP PROCESS OUTPUT REQUEST
LDC 100
ADD PC
* RETURN HERE AT END OF INPUT/OUTPUT PROCESSING.
ITO5 STI EP SET REQUEST TYPE
LDN 0 SET REQUEST PROCESSED
STM 1,EP
SOM TCRQ DECREMENT TOTAL COUNT OF REQUESTS
ZJN ITO6 IF NO MORE ENTRIES
LJM ITO1 PROCESS NEXT ENTRY
* ALL ENTRIES ARE COMPLETED AND NOTIFICATION SENT TO *IAF*.
ITO6 ENDMS
LDD IA RETURN ENTRIES AND COMPLETE
CRD IR
ITO7 RJM SPA WRITE REQUEST POT
CWM EBUF,CT
ITOC EQU *-1 REQUEST QUEUE ADDRESS
LDN VCPC*5
RAM ITOC
RJM UPP UPDATE POT POINTER
NJN ITO7 IF MORE POTS TO WRITE
LDD IA
CRD IR
LDN 0 SET COMPLETION FOR *IAF*
STD IR
STD IR+1
LDD IR+3
SHN 6
ADD RA
SHN 6
ADD IR+4
CWD IR
* UJN DPP DROP PP
DPP SPACE 4,10
** DPP - DROP PP.
DPP MONITOR DPPM DROP PP
LJM PPR EXIT TO PP RESIDENT
TRQC SPACE 4,10
TCRQ CON 0 TOTAL COUNT OF ALL REQUESTS
ABT SPACE 4,10
** ABT - ABORTS IAF.
*
* ENTRY (A) = ERROR CODE.
* PARAMETER POT POINTER SET IN MESSAGE.
*
* CALLS C2D, DFM.
*
* MACROS MONITOR.
ABT SUBR ENTRY
RJM C2D
STM ABTA+6
LDC ABTA ISSUE * 1TO ABORT NN, PPPP.*
RJM DFM DAYFILE MESSAGE
MONITOR ABTM
LJM PPR EXIT TO PP RESIDENT
ABTA DATA C* 1TO ABORT NN, PPPP.*
CAB SPACE 4,10
** CAB - COMPUTE ALLOWABLE BLOCKSIZE.
*
* ENTRY (TN) = TERMINAL NUMBER.
*
* EXIT (A) = BLOCKSIZE IN CM WORDS.
* (NW) = SAME AS (A).
*
* USES CM - CM+4.
CAB SUBR ENTRY/EXIT
LDM PRCA
SBD TN
PJN CAB1 IF MUX TERMINAL
LDD RA
SHN 6
ADK VMST
CRD CM
LDD CM+1
SHN 6
ADD RA
SHN 6
ADD CM+2
ADD TN
CRD CM
LDD CM+3
SHN -6
LPN 37
SHN 3
UJN CAB2 SET NETWORK TERMINAL BLOCKSIZE
CAB1 LDK VOPL*VCPC SET MUX TERMINAL BLOCKSIZE
CAB2 SBN 2 ALLOW FOR LINKAGE WORDS
STD NW
UJN CABX RETURN
TTL 1TO - GENERAL SUBROUTINES.
CKN SPACE 4,15
** CKN - CHECK THE NEXT EQUIPMENT.
*
* ENTRY (T5) = CURRENT EST ORDINAL.
* (CKNB) = POINTER TO LAST ENTRY ADDRESS.
*
* EXIT (A) .EQ. 0, IF THE SAME EST ORDINAL.
* (A) .NE. 0, NO REQUEST OF SAME TYPE AND EQ FOUND.
* (T5) = CURRENT EST ORDINAL.
* (EP) = POINTER TO NEXT REQUEST.
*
* USES EP.
CKN2 LDN 1 SET NOT FOUND
CKN SUBR ENTRY/EXIT
LDD T5
ZJN CKN2 IF NO EQUIPMENT TO MATCH
LDN 2 ADVANCE TO NEXT ENTRY
RAM CKNB
LMM CUAD
ZJN CKN2 IF END OF REQUESTS OF SAME TYPE
LDM * NEXT ENTRY TO PROCESS - RESET BY *CUA*
CKNB EQU *-1
STD EP
LDM 1,EP
ZJN CKN2 IF NEXT ENTRY ALREADY PROCESSED
LDD T5 CURRENT EQUIPMENT
LMI EP
UJN CKNX EXIT
CUA SPACE 4,10
** CUA - CHECK UNIT ACTIVITY.
* DETERMINES THE BEST EQUIPMENT TO PROCESS ENTRIES FOR WITHIN
* AN INPUT OR OUTPUT GROUP. THIS DETERMINATION IS BASED ON
* MASS STORAGE ACTIVITY.
*
* ENTRY (ITOB) = INPUT REQUESTS REMAINING.
* (CUAA) = FWA OF OUTPUT REQUEST GROUP.
* (CUAB) = LWA+1 OF ALL REQUESTS.
* (CUAC) = FWA OF GROUP TO BE PROCESSED.
* (CUAD) = LWA+1 OF GROUP TO BE PROCESSED.
*
* CUAA - CUAD CONTAIN POINTERS INTO *TEPS*.
*
* EXIT (EP) = CORRECT ENTRY POINTER.
* (T5) = CORRECT EQUIPMENT.
* (CKNB) = POINTER TO ENTRY POINTER IN *TEPS*.
*
* USES T1 - T5, CM - CM+4, EP.
*
* CALLS DRC.
*
* MACROS ENDMS, SFA.
CUA SUBR ENTRY/EXIT
RJM DRC DROP RESERVED CHANNEL
LDM ITOB
NJN CUA1 IF INPUT GROUP NOT PROCESSED
LDC TEPS SET FWA OF OUTPUT REQUEST GROUP
CUAA EQU *-1 (SET BY PRS)
STM CUAC
LDC TEPS SET LWA+1 OF ALL ENTRIES
CUAB EQU *-1 (SET BY PRS)
STM CUAD
CUA1 LDC TEPS START SEARCH AT BEGINNING OF GROUP
CUAC EQU *-1
STD T3
LCN 0 INITIALIZE EQUIPMENT
STD T5
STD T2 INITIALIZE ACTIVITY COUNT
* PROCESS ENTRY.
CUA2 LDI T3 SET ENTRY ADDRESS
STD EP
LDM 1,EP
ZJN CUA3 IF ENTRY ALREADY PROCESSED
LDI EP
LMD T5
ZJN CUA3 IF THIS EQUIPMENT ALREADY CHECKED
LMD T5
STD T5 CHECK ACTIVITY
SFA EST
ADK EQDE
CRD CM
LDD CM+4
SHN 3
ADN DALL
CRD CM
LDD CM
SBD T2
PJN CUA3 IF NOT BETTER THAN PREVIOUS BEST
RAD T2
LDD EP
STD T1
LDD T3 MOVE TEPS POINTER
STD T4
LDD T2
ZJN CUA4 IF NO ACTIVITY ON DEVICE
CUA3 LDN 2 CHECK NEXT ENTRY
RAD T3
LMC * LWA+1 OF CURRENT GROUP
CUAD EQU *-1
NJP CUA2 IF MORE ENTRIES
LDD T1 SET BEST ENTRY
STD EP
LDI EP
STD T5
CUA4 LDD T4
STM CKNB
LJM CUAX EXIT
DRC SPACE 4,10
** DRC DROP RESERVED CHANNEL.
*
* ENTRY (T5) = EST ORDINAL IF CHANNEL RESERVED.
*
* MACROS ENDMS.
DRC SUBR ENTRY/EXIT
LDD T5
ZJN DRCX IF NO CHANNEL RESERVED
ENDMS
LDN 0
STD T5
UJN DRCX EXIT
PRC SPACE 4,10
** PRC - PROCESS *1RO* CALL.
*
* ENTRY (TN) = TERMINAL NUMBER.
* (WC) = 0.
* (PRCA) = LAST MUX TERMINAL NUMBER.
*
* EXIT TO *DPP*.
*
* USES CM - CM+4.
*
* CALLS LDP, UTT.
*
* MACROS DELAY, EXECUTE, MONITOR, PAUSE.
PRC EXECUTE 2TO LOAD OUTPUT OVERLAY
AOM /2TO/UTTA SKIP THE *UDA* CALL
LDC IROB
RJM /2TO/LDP LOAD POTS
RJM /2TO/UTT UPDATE TERMINAL TABLE
LDD PC PUT POT COUNT IN REQUEST
STM PRCB+1
PRC1 LDD MA MAKE OUTPUT ASSIGNMENT
CWM PRCB,ON
LDK ZERL
CRD CM
MONITOR TSEM
LDD CM+1
ZJP DPP IF *IAF* INACCESSIBLE OR ERROR
LMC 7777
NJP DPP IF REQUEST ACCEPTED
PAUSE ST
LDC 3600 *TSEM* QUEUE FULL - DELAY AND RETRY
STD T1
PRC2 DELAY
SOD T1
ZJN PRC1 IF TIME TO REISSUE REQUEST
UJN PRC2 CONTINUE TO DELAY
PRCA CON 0 LAST MUX TERMINAL
PRCB VFD 12/VASO,12/,12/,12/,12/
SPACE 4,10
** COMMON DECKS.
*CALL COMPC2D
*CALL COMPSPA
*CALL COMPSTA
EJT$ EQU 1 SELECT EJT PROCESSOR
IFP$ EQU 1 SELECT REMOTE INITIALIZATION CODE
*CALL COMPGFP
*CALL COMPUPP
IDP TITLE INPUT DATA PROCESSING.
** IDP - INPUT DATA PROCESSING.
*
* ENTRY (PP) = POT POINTER.
* (T5 - T7) = DISK PARAMETERS.
* DRIVER LOADED.
*
* EXIT CHANNEL RELEASED.
* (TESA) = UPDATED DISK INFORMATION.
* INPUT DATA APPENDED TO PRIMARY FILE.
*
* USES BA, LP, PC, PL, PP.
*
* CALLS ABT, DPB, RPD, SLB, WES.
*
* MACROS ENDMS, MONITOR, SETMS.
IDP SUBR ENTRY/EXIT
LDM 2,EP SET LENGTH OF DATA IN LAST POT
SHN -11
ADC LDNI
STM IDPA
LDM 2,EP SET NUMBER OF POTS TO PROCESS
LPC 777
STM IDPB
NJN IDP1 IF POTS TO DUMP
* ABORT IAF ON ILLEGAL POT COUNT.
ENDMS
LDN 6
RJM ABT ABORT IAF
* SET POT PARAMETERS.
IDP1 LDC IBUF BUFFER ADDRESS
STD BA
IDPA LDN 0 LENGTH OF DATA IN LAST POT
STD PL
LDC 0 NUMBER OF POTS TO PROCESS
IDPB EQU *-1
STD PC SET POT COUNT
ADC -BUFP
MJN IDP2 IF ROOM IN ONE BUFFER
STM IDPB
LDC BUFP ONE BUFFER FULL
STD PC
LDN 0 PROCESS ALL OF LAST POT
STD PL
UJN IDP3 PROCESS BUFFER
IDP2 LDN 0 SET COMPLETE
STM IDPB
* APPEND INPUT TO PRIMARY FILE.
IDP3 RJM RPD READ POT DATA TO PP BUFFER
SETMS IO,(ND),IBUF
LDC IBUF
STD BA
RJM SLB SET SECTOR LINKAGE BYTES
LDC IBUF RESET BUFFER ADDRESS
STD BA
RJM DPB DUMP BUFFER TO DISK
LDM IDPB
ZJN IDP4 IF PROCESS COMPLETE
LJM IDP1 LOOP FOR NEXT BUFFER
IDP4 RJM WES WRITE EOI SECTOR
* UPDATE TERMINAL TABLE.
AOD CN+4 SET TERMINAL TABLE COMPLETE
LDD TT UPDATE TERMINAL TABLE
SHN 14
ADD TT+1
ADN VROT
CWD CN
LJM IDPX RETURN
DPB SPACE 4,10
** DPB - DUMP POT BUFFER TO DISK.
*
* ENTRY (BA) = BUFFER ADDRESS.
* (BC) = BUFFER COUNT.
* (T4) = CHANNEL.
* (T5) = EQUIPMENT.
* (T6) = CURRENT TRACK.
* (T7) = CURRENT SECTOR.
*
* EXIT (T6) = CURRENT TRACK AFTER WRITE.
* (T7) = NEXT SECTOR AFTER WRITE.
*
* USES BA, BC, T6, T7.
*
* CALLS POS, WDS.
DPB SUBR ENTRY/EXIT
DPB1 LDD BA WRITE DISK SECTOR
LMC WCSF WRITE CONSECUTIVE SECTOR
RJM WDS
MJN DPBX IF FATAL DISK ERROR
AOD T7 ADVANCE SECTOR
LDI BA SET NEXT SECTOR TO WRITE
SHN 6
PJN DPB2 IF NOT NEW TRACK
SHN -6
STD T6
LDN 0
STD T7
DPB2 LDC 502 ADVANCE BUFFER POINTER
RAD BA
SOD BC DECREMENT BUFFER COUNT
NJN DPB1 IF NOT LAST SECTOR
UJN DPBX RETURN
RPD SPACE 4,15
** RPD - READ POT DATA TO PPU BUFFER.
*
* ENTRY (BA) = FWA PP BUFFER.
* (PP) = FIRST POT POINTER.
* (PC) = POT COUNT.
* (PL) = LENGTH OF DATA IN LAST POT.
*
* EXIT ((BA)) = LOADED WITH DATA FROM POTS.
* (BC) = NUMBER OF SECTORS READ (BUFFER COUNT).
* REQUEST QUEUE ENTRY UPDATED.
* WORD COUNT SET IN SECTOR CONTROL BYTES.
*
* USES BA, BC, T3, WC.
*
* CALLS SPA, UPP.
RPD7 AOD BC COUNT BUFFER
LDD WC SET WORD COUNT IN SECTOR CONTROL BYTES
STI BA
LDM RPDA ADVANCE BUFFER ADDRESS
STD BA
LDD PC
NJN RPD1 IF NOT LAST POT
LDD T3 SET POTS TO DROP IN QUEUE ENTRY
STM 2,EP
NJN RPDX IF POTS TO DROP
STM 3,EP CLEAR FIRST POT POINTER
RPD SUBR ENTRY/EXIT
LDN 0 INITIALIZE BUFFER COUNT
STD BC
STD T3
RPD1 AOD BA SET FWA OF DATA IN BUFFER
ADN 1
STM RPDA
LDN 0 RESET WORD COUNT
STD WC
* READ NEXT POT TO BUFFER.
RPD2 RJM SPA SET POT ADDRESS
CRM *,CT
RPDA EQU *-1
SOD PC DECREMENT POT COUNT
NJN RPD3 IF NOT LAST POT
LDD PL
NJN RPD4 IF POT LENGTH PASSED
RPD3 LDD PP SET LAST POT TO DROP
STD T3
* ADVANCE TO NEXT POT.
LDN VCPC
RPD4 RAD WC ADVANCE WORD COUNT
LDN VCPC*5 ADVANCE READ ADDRESS
RAM RPDA
RJM UPP UPDATE POT POINTER
LDD PP
ZJN RPD6 IF END OF CHAIN
LDD WC
SHN -6
NJN RPD5 IF FULL SECTOR
LDD PC
NJN RPD2 IF NOT LAST POT
RPD5 LJM RPD7 TERMINATE SECTOR
RPD6 STD PC TERMINATE DATA PROCESSING
STM IDPB
UJN RPD5 TERMINATE SECTOR
SLB SPACE 4,10
** SLB - SET SECTOR LINKAGE BYTES.
*
* NOTE - IT IS ASSUMED THAT THE SECTOR LIMIT OF THE
* DEVICE WHICH THE PRIMARY FILE RESIDES UPON IS LESS THAN
* THE MAXIMUM NUMBER OF SECTORS CONTAINED IN *BUFF*.
*
* ENTRY (BA) = BUFFER ADDRESS.
* (T5) = EQUIPMENT.
* (T6) = TRACK.
* (T7) = SECTOR.
*
* EXIT ((BA)) = LINKAGE BYTES SET.
* (BC) = TRUNCATED, IF ADDITIONAL TRACK UNAVAILABLE.
*
* USES CM - CM+4, T1, T2, T3.
SLB SUBR ENTRY/EXIT
LDM SLM SET LAST BUFFER ON THIS TRACK
SBN 1
STD T3
SBD T7 SET NUMBER OF SECTORS REMAINING ON TRACK
STD SC
SBD BC
PJN SLB1 IF ROOM ON PRESENT TRACK
RJM SNT SET TRACK LINK
STD CM+4
NJN SLB1 IF TRACK ASSIGNED
LDD SC TRUNCATE DATA
STD BC
* SET LINKAGE BYTE.
SLB1 LDD T7 SET SECTOR INDEX
STD T1
LDD BC SET BUFFER COUNT
STD T2
SLB2 LDD T1
LMD T3
NJN SLB3 IF NOT LAST BUFFER ON THIS TRACK
STD T1 RESET SECTOR INDEX
LDD CM+4 SET NEXT TRACK IN LINKAGE
UJN SLB4
SLB3 AOD T1 ADVANCE SECTOR INDEX
SLB4 STI BA SET SECTOR LINKAGE
LDC 502 ADVANCE BUFFER ADDRESS
RAD BA
SOD T2
NJN SLB2 IF NOT LAST BUFFER
LJM SLBX RETURN
WES SPACE 4,10
** WES - WRITE EOI SECTOR.
*
* ENTRY (T5) = EQUIPMENT.
* (T6) = CURRENT TRACK.
* (T7) = CURRENT SECTOR.
* (TN) = TERMINAL NUMBER.
*
* EXIT EOI SECTOR WRITTEN, UPDATED DISK INFORMATION SET.
*
* CALLS STA, WEI.
WES SUBR ENTRY/EXIT
RJM STA SET TERMINAL TABLE ADDRESS
ADN VUIT GET EJT
CRD CM
LDD CM+4
SFA EJT
ADN PRFE
CRD CM
LDD CM+4 SET FIRST TRACK OF FILE IN EOI SECTOR
STM BUFF+FTEI
LDC BUFF WRITE EOI
RJM WEI
UJN WESX RETURN
SPACE 4,10
** COMMON DECKS.
*CALL COMPSNT
IF DEF,FA,1
ERR *FA* MUST NOT BE DEFINED FOR *COMPWEI*
*CALL COMPWEI
IBUF SPACE 4,10
** INPUT BUFFER SPACE.
IBUF EQU * INPUT BUFFER FWA
TITLE PRESET.
PRS SPACE 4,10
** PRS - PRESET.
*
* ENTRY REQUEST QUEUE FORMAT FOR IAF REQUEST QUEUE -
*
*T 4/ ,1/ PFIC,1/ FT,6/ RT,12/ EJTO,12/ NP,12/ FP,12/ TN
*
* PFIC = PRIMARY FILE INITIAL CALL FLAG.
* 1 = PRIMARY FILE INITIAL CALL.
* 0 = PRIMARY OR ROLLOUT FILE CONTINUATION CALL.
* FT = FILE TYPE.
* 0 = PRIMARY FILE.
* 1 = ROLLOUT FILE.
* RT = REQUEST TYPE.
* 0 = DUMP INPUT TO PRIMARY FILE.
* 1 = OUTPUT TO TERMINAL.
* EJTO = EJT ORDINAL OF JOB.
* NP = NUMBER OF POTS TO DUMP TO PRIMARY FILE (INPUT).
* FP = FIRST POT FOR EITHER INPUT OR OUTPUT.
* TN = TERMINAL NUMBER.
*
* EXIT REQUEST QUEUE FORMAT FOR IAF REQUEST QUEUE -
*
*T, 12/ EQ,12/ TK,12/ P1,12/ P2,12/ TN
*
* EQ = EST ORDINAL.
* TK = TRACK NUMBER.
* INPUT - CURRENT EOI.
* OUTPUT - FIRST SECTOR OF OUTPUT.
* - FIRST CALL ON LIST, FROM *PRFE* IN EJT.
* - CONTINUATION CALL, FROM SCHEDULE FIELD IN EJT.
* P1 = INPUT - WORD COUNT IN LAST POT, THREE TOP BITS.
* - NUMBER OF POTS TO DUMP, NINE BOTTOM BITS.
* OUTPUT - FIRST SECTOR OF OUTPUT.
* - FIRST CALL ON LIST, 1.
* - CONTINUATION CALL, FROM SCHEDULE FIELD IN EJT.
* P2 = FIRST POT POINTER.
* INPUT - POT TO BEGIN DUMPING TO PRIMARY FILE.
* OUTPUT - POT TO WRITE OUTPUT INTO.
* TN = TERMINAL NUMBER.
*
* *TEPS* ENTRY -
*
* 12/ PTR,12/ EXP
*
* PTR = POINTER TO ENTRY.
* EXP = EXTRA PARAMETER.
* INPUT - SECTOR NUMBER OF CURRENT EOI.
* OUTPUT - WORD COUNT IN CURRENT SECTOR OF OUTPUT, FROM
* SCHEDULE FIELD ON CONTINUATION CALL.
PRS RJM IFP INITIALIZE *COMPGFP*
LDN VCPC SET LENGTH OF A POT
STD CT
LDD RA
SHN 6
ADN VNTP
CRD T5 SET FWA OF NETWORK TERMINALS
LDD T5+2
SBN 1 SET LAST MULTIPLEXOR TERMINAL ADDRESS
PJN PRS0 IF NETWORK TERMINALS DEFINED
LDD RA GET MAXIMUM USER COUNT
SHN 6
ADK VMNL
CRD T5
LDD T5+4
ADK VPST-1 NUMBER OF PSEUDO TERMINALS
PRS0 STM PRCA STORE LAST MUX TERMINAL NUMBER
LDD IR+2
SHN -6 FORMAT MESSAGE
RJM C2D CONVERT DIGITS
STM ABTA+10
LDD IR+2
RJM C2D
STM ABTA+11
LDD IR+2
NJP PRS4 IF IAF CALL
* PROCESS *1RO* CALL.
LDC PRCB SET ENTRY POINTER
STD EP
LDD IR+4 SET TERMINAL NUMBER
STD TN
STM PRCB+4
RJM STA SET TERMINAL TABLE ADDRESS
ADK VUIT
CRD FS
ADN VROT-VUIT
CRD CN
LDD CN+4 CHECK OUTPUT AVAILABLE
SHN 21-4
PJN PRS2 IF NO OUTPUT DATA
* IF A FULL SECTOR OF DATA RESIDES IN THE *1RO* BUFFER AND IF
* THE TERMINAL HAS A BLOCKSIZE OF GREATER THAN ONE SECTOR,
* THEN *1TO* MUST MAKE A NULL OUTPUT ASSIGNMENT IN ORDER TO
* AVOID SPLITTING WHAT COULD BE A LINE LESS THAN BLOCKSIZE
* WORDS ACROSS TWO DOWNLINE BLOCKS BECAUSE THERE IS NO ROOM
* IN THE BUFFER TO READ IN ADDITIONAL SECTORS.
RJM CAB COMPUTE ALLOWABLE BLOCKSIZE
LDM IROB+1
STD WL
SHN -6
ZJN PRS1 IF ALL OUTPUT CONTAINED IN *1RO* BUFFER
LDD WL
SBD NW
MJN PRS2 IF BLOCKSIZE EXCEEDS ONE SECTOR
PRS1 LDK ZERL
CRD CM
LDD NW
ADK 7+2 ADD ROUNDUP AND LINKAGE WORDS FACTORS
SHN -3
ERRNZ VCPC-10 CODE DEPENDS ON POT SIZE OF 10B
STD CM+1
MONITOR TGPM GET POTS
LDD CM+1
STD PP
STM PRCB+3
NJN PRS3 IF A POT WAS GIVEN
PRS2 LJM PRC1 ASSIGN NULL OUTPUT
PRS3 LMC 7777
NJN PRS3.1 IF NOT A FUNCTION REJECT
LDC 3600 REISSUE REQUEST AFTER DELAY
STD T1
PRS3.0 DELAY
SOD T1
NJN PRS3.0 IF NOT TIME TO REISSUE REQUEST
UJN PRS1 TRY AGAIN
PRS3.1 LDN 0
STD WC
SFA EJT,FS+4
ADN SCHE
CRD CM
LDD CM+3 MOVE CURRENT TRACK
STD FS+2
LDD CM+4 MOVE CURRENT SECTOR
STD FS+3
LJM PRC ENTER MAIN LOOP FOR *1RO* CALL
* PRESET IAF REQUEST QUEUE CALL.
PRS4 RJM SPA SET POT ADDRESS (PP= IR+2)
CRM EBUF,CT READ UP ENTRIES
PRSA EQU *-1
LDN VCPC*5 UPDATE POINTER
RAM PRSA
STD T2
RJM UPP UPDATE POT POINTER
NJN PRS4 IF MORE ENTRIES TO READ
STM 1,T2 SET TERMINATOR BYTE
STD IN INITIALIZE INPUT REQUEST COUNT
STD OT INITIALIZE OUTPUT REQUEST COUNT
STD EC INITIALIZE ENTRY COUNT
LDC EBUF ENTRY POINTER
STD EP
PRS5 LDM 1,EP GET EJTO
ZJN PRS10 IF ALL ENTRIES PROCESSED
SFA EJT READ EJT
ADN JSNE
CRD CM
ADN SCHE-JSNE
CRD FS
ADN PRFE-SCHE
CRD CN
LDI EP
LPN 77
ZJN PRS6 IF INPUT OPERATION
* PROCESS OUTPUT REQUESTS.
AOD OT COUNT OUTPUT REQUEST
RJM POR PROCESS OUTPUT REQUEST
UJN PRS7 COMPLETE PROCESSING
* PROCESS INPUT REQUESTS.
PRS6 AOD IN COUNT INPUT REQUEST
LDD OT
NJN PRS8 IF REQUESTS OUT OF ORDER
RJM RIT RESERVE INPUT TRACKS
* COMPLETE PROCESSING FOR BOTH REQUEST TYPES.
PRS7 STM SNTB,EC SAVE SECTOR NUMBER OR WORD COUNT
AOD EC
LDN 5
RAD EP
UJN PRS5 LOOP FOR NEXT ENTRY
PRS8 LDN 1 REQUEST OUT OF ORDER
PRS9 RJM ABT ABORT
* SET LWA AND REQUEST COUNTS.
PRS10 LDD IN NUMBER OF INPUT REQUESTS
STM ITOB
SHN 1 * 2
RAM CUAA SET FWA OF OUTPUT REQUEST POINTERS
STM CUAD SET LWA+1 OF INPUT REQUEST POINTERS
LDD IN
SHN 2
ADD IN
RAM GNEC LWA+1 OF INPUT REQUEST GROUP
LDD OT NUMBER OF OUTPUT ENTRIES
ADD IN TOTAL OF ALL REQUESTS
NJN PRS11 IF REQUESTS
LDN 2 NO REQUESTS
UJN PRS9 ABORT
PRS11 STM TCRQ SET TOTAL NUMBER OF REQUESTS
SHN 1 * 2
RAM CUAB
RJM SEP SORT ENTRY POINTERS
LDN 0 INITIALIZE EST ORDINAL
STD T5
LJM ITO1 ENTER MAIN LOOP
CEQ SPACE 4,10
** CEQ - CHECK EQUIPMENT.
*
* ENTRY (A) = EST ORDINAL.
* (EP) = ENTRY ADDRESS.
*
* EXIT ((EP)) = EST ORDINAL+4000.
*
* USES T0 - T4.
*
* CALLS ABT.
*
* MACROS SFA.
CEQ SUBR ENTRY/EXIT
LMC 4000 SET NOT SORTED ENTRY FLAG
STI EP SAVE EST
LMC 4000
ZJN CEQ1 IF NOT MASS STORAGE
SFA EST READ EST ENTRY
ADK EQDE
CRD T0
LDD T0
SHN 21-13
MJN CEQX IF MASS STORAGE
CEQ1 LDN 3 NOT MASS STORAGE
RJM ABT ABORT
GNE SPACE 4,20
** GNE - GET NEXT ENTRY.
*
* ENTRY (GNEA) = IF OUTPUT GROUP, NUMBER OF INPUT ENTRIES.
* (GNEB) = FWA FOR ENTRIES IN THIS GROUP.
* (GNEC) = LWA+1 FOR ENTRIES IN THIS GROUP.
*
* EXIT (T5) = SELECTED EQUIPMENT.
* (T6) = SELECTED TRACK.
* (CN+1) = POINTER TO SELECTED ENTRY.
* (CN+2) = ENTRY NUMBER.
* ENTRY MARKED AS PROCESSED.
*
* CALLS ABT.
GNE SUBR ENTRY/EXIT
GNEA LDN 0 (PROCESSING INPUT)
* LDN N (PROCESSING OUTPUT, N = NUMBER OF INPUTS)
STD CN+3 ENTRY NUMBER TO START AT
LCN 0
STD T5
STD T6
LDC EBUF FWA ENTRIES
GNEB EQU *-1
STD CN
GNE1 LDI CN
SHN 21-13
PJN GNE2 IF ALREADY PROCESSED
SHN 13-21
LPC 3777 SET EQUIPMENT
STD T0
SBD T5
MJN GNE4 IF BETTER CHOICE
ZJN GNE3 IF SAME EQUIPMENT
GNE2 AOD CN+3 INCREMENT ENTRY COUNT
LDN 5
RAD CN
LMC EBUF
GNEC EQU *-1
NJN GNE1 IF GROUP NOT COMPLETED
LDD T5 MARK ENTRY PROCESSED
STI CN+1
LMC 7777
ZJN GNE5 IF NO ENTRY FOUND
LJM GNEX EXIT
GNE3 LDM 1,CN CHECK TRACK
SBD T6
PJN GNE2 IF NOT A BETTER CHOICE
GNE4 LDD T0 UPDATE EQ
STD T5
LDM 1,CN UPDATE TK
STD T6
LDD CN UPDATE POINTER
STD CN+1
LDD CN+3 SAVE ENTRY NUMBER
STD CN+2
UJN GNE2 CHECK NEXT ENTRY
GNE5 LDN 5 NO ENTRY FOUND
RJM ABT ABORT
POR SPACE 4,10
** POR - PROCESS OUTPUT REQUEST.
*
* ENTRY (FS - FS+4) = EJT ENTRY WORD *SCHE*.
* (CN - CN+4) = EJT ENTRY WORD *PRFE*.
* (CM - CM+4) = EJT ENTRY WORD *JSNE*.
*
* EXIT ((EP)) = FORMATTED REQUEST - EQ,TK,SC,FP,TN.
* (A) = WORD COUNT.
*
* USES CM - CM+4.
*
* CALLS ABT, CEQ.
*
* MACROS MONITOR.
POR SUBR ENTRY/EXIT
LDI EP CHECK FILE TYPE
SHN 21-6
PJN POR2 IF NOT ROLLOUT FILE OUTPUT
LDD FS INSERT RO EQ INTO REQUEST
RJM CEQ CHECK EQUIPMENT
POR1 LDD FS+3 SET CURRENT TRACK
STM 1,EP
LDD FS+4 SET CURRENT SECTOR
STM 2,EP
LDD FS+2 SET WORD COUNT
LPN 77
UJN PORX RETURN
POR2 LPN 1
LMC LDNI
STM PORA
LDD CN+3 SET PRIMARY FILE EQUIPMENT
RJM CEQ CHECK PRIMARY FILE EQUIPMENT
LDN 0 CONTINUATION CALL
PORA EQU *-1 (PRIMARY FILE INITIAL CALL)
ZJN POR1 IF CONTINUATION CALL
* START NEW OUTPUT ON PRIMARY FILE.
LDM 1,EP SET EJT ADDRESS
SFA EJT
STD CM+4
SHN -14
STD CM+3
LDD CN+4 PRESET CT=FT
STM 1,EP
LDN FSMS PRESET CURRENT SECTOR = 1
STM 2,EP
LDD MA SET I/O JOB STATUS
CWM PORB,ON
LDN 1
STD CM+1
MONITOR UTEM
LDD CM+1
NJN POR4 IF OPERATION NOT COMPLETE
LDD MA CHECK OLD STATUS
CRD CM
LDD CM+4
SBN IOJS
ZJN POR3 IF IOJS STATUS
SBN DOJS-IOJS
NJN POR4 IF NOT DOJS STATUS
POR3 LJM PORX EXIT
POR4 LDN 4
RJM ABT ABORT
PORB VFD 6/JSNE,6/5,6/1,42/IOJS
RIT SPACE 4,10
** RIT - REQUEST INPUT TRACKS.
*
* ENTRY (CN - CN+4) = EJT ENTRY WORD *PRFE*.
*
* EXIT (A) = SECTOR NUMBER OF EOI ON THE DEVICE.
* TRT RESET TO NEW EOI.
*
* USES T0, T4, T5, CM - CM+4.
*
* CALLS ABT, CEQ, SEI.
*
* MACROS MONITOR.
RIT SUBR ENTRY/EXIT
LDD CN+4 MOVE PRIMARY FILE FIRST TRACK
STD T6
LDD CN+3 MOVE PRIMARY FILE EQUIPMENT
STD T5
RJM CEQ CHECK EQUIPMENT
* CHECK FOR ROOM ON DISK.
LDM 2,EP COMPUTE SECTOR COUNT
SHN -11
STD T0
LDM 2,EP
LPC 777
SHN 3
ADD T0
ADN 77
SHN -6 SECTOR COUNT
STD T4
RJM SEI SET T7
LDD T6 SAVE CURRENT EOI POSITION
STD CM+2
STM 1,EP
LDD T5
STD CM+1
LDM SLM
SBN 1
SBD T7
SBD T4
PJN RIT1 IF ROOM ON TRACK
LMC -0 SET SECTORS NEEDED
STD CM+4
SHN -14
STD CM+3
MONITOR RTCM
UJN RIT2 CHECK NEXT ENTRY
RIT1 LDD T7 SET NEW EOI POSITION
ADD T4
STD CM+3
LDC -4000
RAD CM+2
MONITOR DTKM
RIT2 LDD T7
LJM RITX EXIT
SEP SPACE 4,10
** SEP - SORT ENTRY POINTERS.
*
* ENTRY (EP) = LWA+1 ALL REQUESTS.
* (IN) = INPUT REQUEST COUNT.
* (OT) = OUTPUT REQUEST COUNT.
*
* EXIT ENTRIES SORTED BY EQUIPMENT AND TRACK, POINTERS
* STORED IN THAT ORDER IN *TEPS*.
*
* USES T3, T4, T7, CN - CN+4.
*
* CALLS GNE.
SEP SUBR ENTRY/EXIT
LDC TEPS
STD T7
SEP1 LDD IN
ZJN SEP4 IF NO INPUT REQUESTS, SWITCH TO OUTPUT
SEP2 RJM GNE GET NEXT ENTRY
LDD CN+1 SET POINTER TO ENTRY
STI T7
AOD T7 MOVE EOI SECTOR OR WORD COUNT
LDM SNTB,CN+2
STI T7
AOD T7
SOD IN
NJN SEP2 IF MORE ENTRIES OF THIS TYPE
LDD OT CHECK OUTPUT REQUEST COUNT
ZJN SEPX IF NO MORE REQUESTS
* SWITCH TO OUTPUT REQUESTS.
LDM ITOB
RAM GNEA
LDM GNEC
STM GNEB
SEP4 LDD EP
STM GNEC
LDD OT
STD IN
LDN 0
STD OT
UJN SEP1 SORT OUTPUT REQUESTS
SPACE 4,10
SPACE 4,10
** COMMON DECKS.
*CALL COMPSEI
IFP HERE
BUFFERS SPACE 4,10
** PRESET BUFFERS.
USE BUFFERS
SNTB EQU * SECTOR NUMBER / WORD COUNT
ERRPL SNTB+VRQB*VCPC-EBUF OVERFLOW INTO ENTRY BUFFER
SPACE 4,10
OVERFLOW
TTL 1TO - TERMINAL INPUT/OUTPUT.
TITLE OUTPUT PROCESSING SUBROUTINES.
QUAL 2TO
IDENT 2TO,TTOX OUTPUT PROCESSING ROUTINES.
*COMMENT 1TO - OUTPUT PROCESSING ROUTINES.
COMMENT COPYRIGHT CONTROL DATA SYSTEMS INC. 1992.
SPACE 4,10
*** *2TO* IS LOADED TO PROVIDE THE ROUTINES NECESSARY FOR
* PROCESSING DOWNLINE OUTPUT.
ORG IDP+5
TTO SUBR ENTRY/EXIT
UJN TTOX RETURN
TTL 1TO/2TO - OUTPUT DATA PROCESOR.
ODP TITLE OUTPUT DATA PROCESSING.
** ODP - OUTPUT DATA PROCESSING.
*
* ENTRY (PP) = POT POINTER.
* (EP) = POINTER TO ENTRY TO PROCESS.
* (T4 - T7) = DISK INFORMATION.
* (FS+2) = TRACK NUMBER OF FIRST SECTOR TO READ.
* (FS+3) = SECTOR NUMBER OF FIRST SECTOR TO READ.
* (WC) = POSITION TO START AT IN FIRST SECTOR.
*
* EXIT (T5) = EST ORDINAL.
*
* USES T1, BA, CB, WC, CM - CM+4, LN - LN+4.
*
* CALLS CAB, LDP, SDI, SPA, SUL, UTT.
ODP SUBR ENTRY/EXIT
LDC BUFF SET BUFFER ADDRESS
STD BA
LDC EBUF-2 SET CONTROL BYTE TABLE ADDRESS
STD CB
RJM CAB COMPUTE ALLOWABLE BLOCKSIZE
LDD PP
ZJP ODP5 IF NO POTS SUPPLIED
RJM SPA SET POT ADDRESS OF USER TEXT POT
CRD LN READ UP LINE NUMBER
LDN LN CONVERT LINE NUMBER TO BINARY
STD T1
RJM SUL
LDD CM
SHN 14
ADD CM+1
ZJN ODP1 IF START AT BEGINNING OF FILE
LMC -0 SET LINE NUMBER TO SEARCH ON
STM SSEA+1
STM SDIA+1
SHN -14
LMC ADCI
STM SSEA
STM SDIA
RJM SDI SEARCH DISK FOR LINE NUMBER
UJN ODP4 TRANSFER LINE TO POTS
ODP1 RJM RDD READ THE FIRST SECTOR OF DATA
PJN ODP2 IF NOT AN EMPTY FILE
LDN 0
STD WL
UJN ODP4 SEND A *0014* BYTE ONLY
ODP2 STD SC SAVE SECTOR WORD COUNT
SBD WC
PJN ODP3 IF POINTER .LT. WC (ONLY VALID CONDITION)
LDN 0 RESET WORD COUNT (NEEDED FOR RECOVERY)
STD WC
ODP3 RJM RAS READ ADDITIONAL SECTORS UP TO BLOCKSIZE
ODP4 LDC BUFF
RJM LDP LOAD POTS
RJM UTT UPDATE TERMINAL TABLE
LDI EP RESTORE EST ORDINAL
STD T5
LJM ODPX RETURN
ODP5 LDN 7 NO POT POINTER FOUND
RJM ABT ABORT
TITLE PRO - SUBROUTINES.
TITLE OUTPUT PROCESSING SUBROUTINES.
ANR SPACE 4,10
** ANR - ASSURE NETWORK REQUIREMENTS.
*
* *ANR* ENSURES THAT NO MORE THAN BLOCKSIZE WORDS OF DATA ARE
* EVER SENT TO THE TERMINAL IN A SINGLE DOWNLINE BLOCK. IF
* THERE ARE LESS THAN BLOCKSIZE WORDS OF DATA REMAINING, ALL
* DATA IS SENT. IF THERE ARE BLOCKSIZE OR MORE WORDS OF DATA,
* *ANR* MAKES SURE THAT AS MANY WHOLE LINES AS POSSIBLE ARE
* SENT WITHOUT EXCEEDING THE BLOCKSIZE LIMIT. A PARTIAL LINE
* IS ONLY SENT IN THE CASE WHERE THE FIRST LINE OF DATA
* IN THE BUFFER IS LONGER THAN BLOCKSIZE WORDS.
*
* ENTRY (BA) = BUFFER ADDRESS.
* (NW) = USER BLOCKSIZE IN CM WORDS.
* (WL) = NUMBER OF WORDS LOADED IN BUFFER.
*
* EXIT (A) = NUMBER OF WORDS TO SEND TO THE TERMINAL.
* (NW) = SAME AS (A).
* (CN+4) = OUTPUT AVAILABLE FLAG UPDATED.
*
* USES S1.
ANR3 LDD NW
ANR SUBR ENTRY/EXIT
LDD WL
SBD NW
PJN ANR1 IF NUMBER WORDS IN BUFFER .GE. BLOCKSIZE
LCN VOPR CLEAR OUTPUT AVAILABLE FLAG
RAD CN+4
LDD WL SEND ALL THE DATA
STD NW
UJN ANRX RETURN
* ADJUST THE NUMBER OF WORDS TO SEND TO THE TERMINAL TO
* INCLUDE AS MANY COMPLETE LINES AS EXIST IN THE FIRST
* BLOCKSIZE WORDS. IF NO COMPLETE LINES ARE FOUND,
* (LINE IS LONGER THAN BLOCKSIZE WORDS) THEN SEND THE
* FIRST BLOCKSIZE-1 WORDS OF THE LINE.
ANR1 LDM PRCA
SBD TN
PJN ANR3 IF MUX TERMINAL
LDD NW CHECK BACKWARDS THROUGH DATA FOR EOL
STD WL
ADD WC
SHN 2
ADD NW
ADD WC
ADD BA
ADN 1
STD S1
ANR2 LDI S1
ZJN ANR3 IF EOL FOUND
LCN 5
RAD S1
SOD NW
NJN ANR2 IF MORE WORDS LEFT TO CHECK
SOD WL
STD NW
LJM ANRX SEND (BLOCKSIZE - 1) WORDS
LDP SPACE 4,10
** LDP - LOAD DATA INTO POTS.
*
* ENTRY (A) = BUFFER ADDRESS.
* (WC) = WORD INDEX INTO FIRST SECTOR.
* (PP) = FIRST POT TO FILL.
* (EP) = ENTRY POINTER.
* (NW) = USER BLOCKSIZE IN CM WORDS.
* (WL) = NUMBER OF WORDS LOADED IN BUFFER.
*
* EXIT (WL) = NUMBER OF WORDS TRANSFERRED TO POTS.
* (CN+4) = OUTPUT AVAILABLE FLAG UPDATED IF RAN OUT
* OF POTS.
*
* USES BA, CM - CM+4, S1, S2, T3.
*
* CALLS ANR, SPA, UPP.
LDP SUBR ENTRY/EXIT
STD BA SAVE BUFFER ADDRESS
LDN 0 INITIALIZE POT COUNT
STD PC
LDN 2 SET TO LEAVE ROOM FOR HEADER WORDS
STD S2
RJM SPA PUT FIRST POT ADDRESS IN (PA - PA+1)
LDK ZERL ZERO OUT SECOND WORD OF POT CHAIN HEADER
CRD CM
LDD PA
SHN 14
LMD PA+1
ADN 1
CWD CM
RJM ANR ASSURE NETWORK REQUIREMENTS
STD WL
NJN LDP1 IF DATA AVAILABLE TO TRANSFER
STD T3
LDM 3,EP
STM 2,EP
AOD PC COUNT OUTPUT POT
LJM LDP5 RETURN A *0014* CONTROL BYTE ONLY
LDP1 LDD WC COMPUTE ADDRESS OF FIRST WORD TO TRANSFER
SHN 2
ADD WC
ADD BA
ADN 2
STM LDPB
LDK VCPC-2
STD S1
STD T3
UJN LDP3 ENTER TRANSFER LOOP
LDP2 LDD S1
SHN 2
ADD S1
RAM LDPB
LDK VCPC
STD T3
STD S1
LDN 0 SET TO NOT LEAVE ROOM FOR HEADER WORDS
STD S2
RJM UPP
NJN LDP3 IF MORE POTS AVAILABLE
LDD CN+4 SET OUTPUT AVAILABLE TO RECALL *1TO*
SCN VOPR
LMN VOPR
STD CN+4
LDD WL
SBD NW
STD WL
LJM LDPX RETURN
LDP3 LDD NW
SBD S1
STD NW
PJN LDP4 IF AT LEAST ONE FULL POT TO TRANSFER
ADD S1
STD T3
LDN 0 SET END OF DATA
STD NW
LDP4 RJM SPA
ADD S2
CWM *,T3 TRANSFER WORDS INTO POT
LDPB EQU *-1
LDD PP
STM 2,EP
AOD PC COUNT OUTPUT POT
LDD NW
SBN 1
PJP LDP2 IF MORE DATA TO TRANSFER
LDD T3
SBD S1
ZJP LDPX IF DATA ENDS EXACTLY ON A POT BOUNDARY
LDP5 LDK ZERL
CRD CM
LDN 2R"IB" ADD *0014* BYTE TO MARK END OF DATA
STD CM
LDD PA
SHN 14
LMD PA+1
ADD T3
ADD S2
CWD CM
LJM LDPX RETURN
RAS SPACE 4,10
** RAS - READ ADDITIONAL SECTORS.
*
* *RAS* CONTINUES TO READ SECTORS OF DATA INTO THE BUFFER
* UNTIL EITHER BLOCKSIZE WORDS HAVE BEEN LOADED OR UNTIL
* NO DATA REMAINS TO BE READ.
*
* ENTRY (BA) = BUFFER ADDRESS.
* (SC) = SECTOR WORD COUNT.
* (WC) = POSITION IN FIRST SECTOR.
* (NW) = USER BLOCKSIZE IN CM WORDS.
* (CB) = INDEX INTO CONTROL BYTE TABLE.
* (CN - CN+4) = *VROT* WORD.
*
* EXIT (CB) = UPDATED TO POINT TO CONTROL BYTES OF LAST
* SECTOR LOADED.
* (WL) = NUMBER OF WORDS OF OUTPUT IN BUFFER.
*
* USES BA, SC, S1.
*
* CALLS RDD.
RAS SUBR ENTRY/EXIT
LDD SC
SBD WC
STD WL
LDD NW GET BLOCKSIZE
ADD WC
STD S1
RAS1 LDD SC
SBD S1
PJN RASX IF THIS PRU SATISFIES REQUIREMENT
LMC -0
STD S1
LDD SC
SHN -6
NJN RAS2 IF NOT EOR
LDD CN+4
SHN 21-6
PJN RASX IF NOT LIST FILE
RAS2 LDD SC UPDATE BUFFER ADDRESS
SHN 2
ADD SC
RAD BA
ADC 502+1
SBD CB
PJN RASX IF NO MORE BUFFER SPACE
LCN 2
RAD CB
RJM RDD READ DISK
STD SC
MJP RASX IF EOI
RAD WL
UJN RAS1 PROCESS NEXT SECTOR
* THE CALCULATION IN ROUTINE *RAS* FOR NUMBER OF CM WORDS
* NEEDED FOR A NETWORK TERMINAL MUST BE ALTERED IF THE
* NUMBER OF WORDS IN A POT IS CHANGED.
ERRNZ VCPC-10 NUMBER OF WORDS PER POT
RDD SPACE 4,15
** RDD - READ DATA FROM DISK.
*
* ENTRY (BA) = BUFFER ADDRESS.
* (CB) = INDEX INTO CONTROL BYTE TABLE.
* (T4) = CHANNEL.
* (T5) = EQUIPMENT.
* (T6) = TRACK.
* (T7) = SECTOR.
*
* EXIT (A) = WORD COUNT = NEGATIVE IF EOI.
* (T6 - T7) = UPDATED.
*
* USES T3, S2, S3.
*
* CALLS RDS.
RDD4 LDN 0 SET EOI
STI CB
STM 1,CB
RDD5 LCN 0 INDICATE EOI
RDD SUBR ENTRY/EXIT
LDI BA PRESERVE DATA OVERLAID BY CONTROL BYTES
STD S2
LDM 1,BA
STD S3
LDD BA READ SECTOR
RJM RDS
SHN -20 PRESERVE ERROR FLAG
STD T3
LDM 1,BA MOVE CONTROL BYTES TO TABLE
STM 1,CB
LDI BA
STI CB
LDD S2 RESTORE ORIGINAL DATA INTO PLACE
STI BA
LDD S3
STM 1,BA
LDD T3
NJN RDD4 IF READ ERROR
LDI CB
NJN RDD1 IF NOT EOF
LDM 1,CB
ZJN RDD5 IF EOI
RDD1 STD T7 UPDATE SECTOR
SHN 6
PJN RDD2 IF NOT NEW TRACK
SHN -6
STD T6 SET NEW TRACK
LDN 0 RESET SECTOR
STD T7
RDD2 LDI CB
ZJN RDD3 IF EOF
LDM 1,CB
RDD3 LJM RDDX RETURN
SDI SPACE 4,15
** SDI - SEARCH DISK FOR BEGINNING LINE.
*
* ENTRY (T4) = CHANNEL.
* (T5) = EQUIPMENT.
* (T6) = TRACK.
* (T7) = SECTOR.
*
* EXIT (WC)= POSITION OF BEGINNING OF LINE NUMBER
* (WL) = NUMBER OF CM WORDS IN LINE.
*
* USES FS+2, FS+3, LW, SC, T1, T3.
*
* CALLS RAS, RDD, SSE, SUL.
SDI9 LDN 0 INDICATE NO LINE FOUND
STD WL
SDI SUBR ENTRY/EXIT
LDN 0 PRESET LAST WORD
STD WC PRESET CM WORD COUNT
SDI1 STD LW
SDI2 LDD T6 SAVE DISK INFORMATION
STD FS+2
LDD T7
STD FS+3
RJM RDD READ DISK
MJN SDI9 IF EOI
ZJN SDI1 IF ZERO LENGTH SECTOR
STD SC SAVE SECTOR WORD COUNT
RJM SSE SEARCH SECTOR
ZJN SDI2 IF NOT FOUND
LDC BUFF+1
STD T1
LDD LW
SDI3 ZJN SDI5 IF ZERO BYTE FOUND
LDN 5
SDI4 RAD T1
AOD WC COUNT CM WORD
LDI T1
UJN SDI3 CHECK NEXT WORD
SDI5 AOD T1
RJM SUL SET LINE NUMBER
LDD CM
SHN 14
ADD CM+1
SDIA ADC * -(LINE NUMBER)
PJN SDI6 IF FIND MADE
LDN 5-1
UJN SDI4 LOOP
SDI6 RJM RAS READ ADDITIONAL SECTORS UP TO BLOCKSIZE
LDD LN+4
ZJN SDI10 IF NOT SINGLE LINE
LDN 0
STD T3
SOD T1
SDI7 LDN 5 FIND NUMBER OF WORDS IN THE LINE
RAD T1
AOD T3
LDI T1
ZJN SDI8 IF EOL FOUND
LDD T3
SBD WL
MJN SDI7 IF MORE WORDS TO CHECK
SDI8 LDD T3 SAVE NUMBER OF WORDS
STD WL
SDI10 LJM SDIX RETURN
SSE SPACE 4,15
** SSE - SEARCH SECTOR FOR LINE NUMBER OF LAST LINE IN BUFFER.
*
* ENTRY (BUFF) = SECTOR TO SEARCH.
* (A) = SECTOR WORD COUNT.
* (LW) = LAST BYTE IN PREVIOUS SECTOR.
*
* EXIT (A) = 0, IF LINE NUMBER NOT FOUND.
* (LW) = IF NUMBER FOUND, LAST BYTE OF PREVIOUS SECTOR.
* IF NOT FOUND, LAST BYTE OF CURRENT SECTOR.
*
* USES LW, S2, T1, T2.
*
* CALLS SUL.
SSE SUBR ENTRY/EXIT
STD S2 SET PP WORD COUNT
SHN 2
RAD S2
LDD LW SET LAST WORD FOR SEARCH
STM BUFF+1
LDC BUFF+1-5 SET STARTING SEARCH ADDRESS
STD T2
ADD S2
STD T1
* T1 CONTAINS THE ADDRESS OF BYTE FOUR OF THE SECOND TO LAST
* CM WORD IN THE BUFFER.
SSE1 LDI T1
ZJN SSE3 IF ZERO BYTE FOUND
LCN 5
RAD T1
LMD T2
NJN SSE1 IF NOT AT BEGINNING OF BUFFER
SSE2 LDM BUFF+1,S2 GET LAST BYTE IN BUFFER
STD LW
LDN 0 INDICATE FAILURE
LJM SSEX EXIT
SSE3 AOD T1
RJM SUL SET UP FOUND LINE NUMBER
LDD CM
SHN 14
ADD CM+1
SSEA ADC * -(LINE NUMBER)
MJN SSE2 IF DATA NOT IN THIS SECTOR
LDN 1
LJM SSEX EXIT
SUL SPACE 4,10
** SUL - SET UP LINE NUMBER.
*
* *SUL* CONVERTS A LINE NUMBER UP TO FIVE DIGITS LONG
* FROM DISPLAY CODE INTO BINARY.
*
* ENTRY (T1) = ADDRESS OF FIRST BYTE OF LINE NUMBER.
*
* EXIT (T1) = UNCHANGED.
* (CM - CM+1) = RESULT.
*
* USES T2.
SUL SUBR ENTRY/EXIT
LDN 0 CLEAR RESULT
STD CM
STD CM+1
LDI T1
SHN -6
SBN 1R+
PJN SULX IF NON-NUMERIC
ADN 1R+-1R0
MJN SULX IF NON-NUMERIC
STD CM+1
LDI T1
LPN 77
SBN 1R+
PJN SULX IF NON-NUMERIC
ADN 1R+-1R0
SUL1 MJN SULX IF NON-NUMERIC
STD T2
LDD CM+1
SHN 2
ADD CM+1
SHN 1
ADD T2
STD CM+1
LDM 1,T1
SHN -6
SBN 1R+
SUL2 PJN SULX IF NON-NUMERIC
ADN 1R+-1R0
MJN SUL1 IF NON-NUMERIC
STD T2
LDD CM+1
SHN 2
ADD CM+1
SHN 1
ADD T2
STD CM+1
LDM 1,T1
LPN 77
SBN 1R+
PJN SUL2 IF NON-NUMERIC
ADN 1R+-1R0
SUL3 MJN SUL1 IF NON-NUMERIC
STD T2
LDD CM+1
SHN 2
ADD CM+1
SHN 1
ADD T2
STD CM+1
SHN -14
STD CM
LDM 2,T1
SHN -6
SBN 1R+
PJN SUL2 IF NON NUMERIC
ADN 1R+-1R0
MJN SUL3 IF NON-NUMERIC
STD T2
LDD CM
SHN 14
ADD CM+1
SHN 10
ADD CM
SHN 14
ADD CM+1
SHN 1
ADD T2
STD CM+1
SHN -14
STD CM
LJM SULX RETURN
UDA SPACE 4,10
** UDA - UPDATE DISK ADDRESSES.
*
* ENTRY (FS+2) = TRACK NUMBER OF FIRST SECTOR LOADED.
* (FS+3) = SECTOR NUMBER OF FIRST SECTOR LOADED.
* (WC) = WORD INDEX INTO FIRST SECTOR.
* (WL) = NUMBER OF WORDS TRANSFERRED TO POTS.
* (CB) = INDEX TO CONTROL BYTES OF LAST SECTOR READ.
*
* EXIT (A) = 0, IF AT END OF DATA ON ROLLOUT FILE
* (FS+2) = TRACK NUMBER OF SECTOR TO BE ACCESSED ON
* THE NEXT CALL.
* (FS+3) = SECTOR NUMBER OF SECTOR TO BE ACCESSED
* ON THE NEXT CALL.
* (WL) = CONTINUATION POINT IN SECTOR.
UDA SUBR ENTRY/EXIT
LCN 2 MARK END OF CONTROL BYTE TABLE
RAD CB
LDK 7777
STI CB
STM 1,CB
LDC EBUF-2 RESET INDEX TO START OF TABLE
STD CB
LDD WC
RAD WL
UDA1 LDI CB
ZJN UDA2 IF EOF
LDD WL
SBM 1,CB
MJN UDAX IF UPDATE COMPLETE
STD WL
NJN UDA2 IF DATA DOES NOT END ON SECTOR BOUNDARY
LDM 1,CB
SHN -6
NJN UDA2 IF LAST SECTOR WAS FULL
LDD CN+4
SHN 21-6
MJN UDA2 IF LIST FILE
LCN VOPR NO MORE DATA ON ROLLOUT FILE
RAD CN+4
LDN 0
LJM UDAX EXIT
UDA2 LDI CB UPDATE TRACK AND SECTOR
NJN UDA3 IF NOT EOF
LDM 1,CB
UDA3 STD FS+3
SHN 6
PJN UDA4 IF NOT A NEW TRACK
SHN -6
STD FS+2
LDN 0
STD FS+3
UDA4 LCN 2
RAD CB
LJM UDA1 CHECK NEXT SECTOR
UTT SPACE 4,10
** UTT - UPDATE TERMINAL TABLE.
*
* ENTRY (CN - CN+4) = *VROT* WORD.
* (FS+2) = TRACK NUMBER OF FIRST SECTOR LOADED.
* (FS+3) = SECTOR NUMBER OF FIRST SECTOR LOADED.
* (TT - TT+1) = TERMINAL TABLE ADDRESS.
* (WC) = WORD INDEX INTO FIRST SECTOR.
* (WL) = NUMBER OF WORDS TRANSFERRED TO POTS.
* (CB) = INDEX INTO CONTROL BYTE TABLE.
*
* EXIT TERMINAL TABLE WORD *VROT* UPDATED.
* SCHEDULE FIELD IN EJT UPDATED IF CONTINUATION.
*
* USES CM - CM+4.
*
* CALLS ABT, UDA.
*
* MACROS MONITOR.
UTT SUBR ENTRY/EXIT
LDD CN+4 CHECK FOR MORE OUTPUT
SHN 21-4
PJN UTT2 IF NO MORE OUTPUT
LDN 0
* LDN 1 (*1RO* CALL)
UTTA EQU *-1
NJN UTT1 IF NO NEED TO UPDATE DISK ADDRESSES
RJM UDA
ZJN UTT2 IF NO MORE OUTPUT
UTT1 LDD FS+3 STORE SECTOR
STD CM+4
LDD FS+2 STORE TRACK
STD CM+3
LDD WL STORE WORD COUNT
STD CM+2
LDC SCHE*100+30D
STD CM
LDN 0
STD CM+1
LDD MA STORE MESSAGE BUFFER
CWD CM
UJN UTT3 UPDATE SCHEDULE FIELD
UTT2 LDD MA
CWM UTTB,ON SET REQUEST TO CHANGE JOB STATUS
UTT3 LDD TT GET TERMINAL TABLE ADDRESS
SHN 14
ADD TT+1
ADK VUIT
CRD CM
ADN VROT-VUIT
CWD CN
* UPDATE EJT - JOB STATUS OR SCHEDULE FIELD.
SFA EJT,CM+4 SET EJT ADDRESS
STD CM+4
SHN -14
STD CM+3
LDN 0
STD CM+2
LDN 1
STD CM+1
MONITOR UTEM
LDD CM+1
NJN UTT4 IF REJECT
LJM UTTX EXIT
UTT4 LDN 4 UNEXPECTED EJT STATUS
RJM ABT ABORT IAF
UTTB VFD 6/JSNE,6/5,6/1,42/DOJS
SPACE 4,10
QUAL *
TITLE BUFFERS.
USE BUFFERS
BUFFERS SPACE 4,10
** GENERAL BUFFERS.
BUFF EQU * INPUT/OUTPUT BUFFER
TEPS EQU EPFW-2*VCPC*VRQB
EBUF EQU TEPS-VRQB*VCPC*5-2 REQUEST QUEUE BUFFER
BUFL EQU EBUF-BUFF-2*12 *BUFF* LENGTH - MAXIMUM CONTROL
* BYTE COUNT FOR PPU MEMORY
ERRNG BUFL-VSEC*500 BUFFER AT LEAST MINIMUM SECTORS LONG
IBUFL EQU EBUF-IBUF-2*12 INPUT BUFFER LENGTH
ISEC EQU IBUFL/500B INPUT BUFFER IN SECTORS
BUFP EQU ISEC*100B/VCPC NUMBER OF POTS IN INPUT BUFFER
OVERFLOW /2TO/TTOX,IROB
TTL 1TO - TERMINAL INPUT/OUTPUT.
END