1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-05 18:49:02 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

691 lines
24 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE TYPSER INTERFACE BETWEEN D76INT AND I/O OPERATORS V031
SUBTTL TEUNIS KORTEWEG /TK 10 SEP 85
SEARCH F,S
$RELOC
$HIGH
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
; 1973,1974,1975,1976,1977,1978,1979,1980,1984,1986,1988.
;ALL RIGHTS RESERVED.
.CPYRT<1973,1988>
XP VTYPSE,031
DLMAP ;DEFINE DL10 OFFSETS
ENTRY TYPSER
TYPSER::;REGISTER USE.
;T1,T2,T3 AND T4 ARE SCRATCH
;T1= INTERFACE TO PUTMSG
;T2-T4= USED FOR MESSAGES.
;U USED FOR DISPATCH ADDRESS IN TYPCOM OR LINE BY D76INT ENTRY
;J IS DL-10 MAP ADDRESS
;S IS DEVIOS
;F IS DEVICE LATCH BLOCK ADDRESS
;INTERFACES WITH OUTSIDE MODULES:
;1 SET DL-10 POINTER SDLPT2
; POINTER VALUE PASSED IN T2
; PDP-11 VALUE OF POINTER RETURNED IN T1
;T3 IS ASSUMED NOT TO BE DESTROYED:
;2 PDP-11 NUMBER IS SUPPOSED TO BE IN PDVSTA BYTE FIELD
;3 PUNIT IS ASSUMED TO CONTAIN DEVICE LINE NUMBER RELATIVE TO NTT
;NOTE: WILL THERE BE A FRONT END TABLE IN DL10 MAP
; TERMINALS, PA611R ---- SUB (TOL])?
;4 DLXBAT ADDRESSED BY PDP-11 NUMBER GIVES THE DL10 MAP ADDRESS
;5 PUTMSG J= MAP ADDRESS
; T1= -N,,MESSAGE AREA
;6 HOW TO MAP CONTENT LINE TO DDB ADDRESS??
;NOTE: CATCH DELAY PROBLEM IN RELEASE INIT SEQUENCE IN INI
; BY SETTING INISYNC AND IOACT
;OPCODES SHIPPED TO THE PDP-10
DEVINI==20 ;INITIALIZE A DEVICE
DEVREL==22 ;RELEASE A DEVICE
DATREQ==24 ;SIGNAL PRESENCE OF A BUFFER:
STSREQ==26 ;SHIP STATUS
;STATUS BITS TRANSFERRED BY THE PDP-10 TO THE PDP-11 WITH STSREQ
SETEOF==40 ;CLOSE DOWN OUTPUT:
SETBYT==2 ;SET BYTE SIZE
SETSTA==1 ;SET START:
SETDIA==20 ;SET DIAGNOSTIC MODE FOR LINE
;STATUS BITS TRANSFERRED FROM THE PDP-11
EOFFLG==1 ;END OF FILE FLAG SEEN
DIASTS==20 ;ERROR DETECTED AT PDP-11 INTERRUPT LEVEL
; FOR A DIAGNOSTIC LINE
DIAEXC==40 ;ERROR DETECTED AT PDP-11 EXEC LEVEL
; FOR A DIAGNOSTIC LINE
BADSTS==74 ;ERROR BITS
;IOS BITS SPECIFIC FOR FRONT END DEVICES SERVICED BY THIS MODULE
WTRELB==400000 ;WAITING FOR RELEASE CONFIRMATION, THIS
;BIT WHEN SET CAUSES ALL OTHER QUEUE ENTRIES
;TO BE IGNORED.
;BITS 1,2,3,4,5,6 ARE USED TO STORE THE BYTE SIZE LAST USED FOR THE DEVICE
PAGE
;ENTRY DEFINITIONS
;TYIDSP AND TYODSP ARE USED BY UUOCON TO DISPATCH TO THE
;DEVICE DEPENDENT PART OF THE I/O OPERATORS
ENTRY TYIDSP ;INPUT DEVICE DISPATCH TABLE
ENTRY TYODSP ;OUTPUT DEVICE DISPATCH TABLE
;DISPATCH TABLES
;TABLE FOR INPUT DEVICES
POPJ P, ;SPECIAL ERROR STATUS
JRST CHK11 ;COMPUTE BUFFER SIZE
POPJ P, ;DO NOT DISTURB THE PDP-11
JRST TYPREL ;HUNG DEVICE
TYIDSP::JRST TYPREL ;RELEASE THE DEVICE
JRST ILLOUT## ;OUTPUT CLOSE IS ILLEGAL
JRST ILLOUT## ;NO OUTPUT OPERATOR
JRST TYPINP ;DO INPUT
;OUTPUT DISPATCH TABLE
JRST CHK11 ;NORMAL BUFFER SIZE
POPJ P, ;DO NO DISTURB THE PDP-11
JRST TYPREL ;HUNG DEVICE
TYODSP::JRST TYPREL ;RELEASE THE DEIVICE
JRST TYPCLS ;CLOSE OUTPUT SMOOTHLY
JRST TYPOUT ;DO OUTPUT
JRST ILLINP## ;NO INPUT
PAGE
;TYPCLS CLOSES OUTPUT IN AN ORDERLY FASHION, THE CLOSE DOWN IS
;EITHER REQUESTED BY THE RELEASE OR THE CLOSE PROCESSOR
;IT ISSUES A SETEOF STATUS REQUEST
;NOTE THAT IT DOES NOT CALL SETACT, BUT RAISES THE WTCLSB BIT,
;THIS DOES NOT TIE THE JOB IN CORE
;THE BIT CAN BE CLEARED BY:
;1 RECEIVING EOF STATUS FOR THE LINE FROM THE PDP-11
;2 RECEIVING RELBUF DUE TO A RELEASE CALL, IN THIS
; CASE THE PDP-11 WILL SYNCHROMIZE:
TYPCLS: PUSHJ P,CHKUP ;CHECK IF PDP-11 IS UP
POPJ P, ;NO, OPERATOR IS DONE
PUSHJ P,OUT## ;OUTPUT LAST BUFFERS
PUSHJ P,WAIT1## ; AND WAIT TILL DONE
MOVEI T3,SETEOF ;SEND SET EOF WAIT:
CHK000:
; PJRST P,SNDSTS ;SEND IT AND WAIT:
IF2 <
IFN <CHK000-SNDSTS>,<
PRINTX DO NOT INSERT INSTRUCTIONS AFTER TYPCLS BEFORE SNDSTS
> ;END OF IFN
> ;END OF IF2 STATEMENT
PAGE
;SNDSTS IS CALLED WITH THE FOLLOWING PARAMETERS:
;.T3= BIT PATTERN TO SET THE PDP-11 STATUS
;.T4= ADDITIONAL DATA:
SNDSTS: PUSHJ P,MAPLIN ;MAP LINE INTO T2
MOVEI T2,<STSREQ>B27(T2) ;SET STATUS REQUEST.
MOVE T1,[-3,,T2] ;MESSAGE AREA T2,T3,T4.
PJRST PUTMSG##
PAGE
;TYPREL CAN BE CALLED WHEN:
;1 AFTER A RELEASE OR CLOSE UUO CLOSED THE OUTPUT SIDE
;2 DUE TO A CALL BY THE RESET UUO.
;IN CASE 1 ALL I/O WAS CLOSED DOWN ORDERLY DUE TO THE
;SETACT CALL FOLLOWED BY THE WAIT1 CALL
;IN CASE 2 THE DEVICE WILL BE CLOSED DOWN IGNORING ANY PENDING REQUESTS.
;HOWEVER THERE MAY BE REQUESTS IN THE TO10 DELAY LINE, THIS CODE
;WILL SET THE WIRELB,WHICH WILL CAUSE ALL QUEUE ENTRIES FOR THIS LINE
;TO BE IGNORED UNTIL THE BUFREL IS TRUE STATUS IS TRANSMITTED VIA
;THE QUEUE OR AN EOF STATUS WHEN THE WTCLSB BIT IS SET.
TYPREL: PUSHJ P,CHKUP ;IS PDP-11 UP
POPJ P, ;NO OPERATOR IS DONE
PUSHJ P,MAPLIN ;MAP LINE INTO T2
MOVEI T2,<DEVREL>B27(T2) ;RELEASE THE DEVICE
MOVSI S,WTRELB ;SET WAIT BIT:
IORM S,DEVIOS(F) ;SET THE FLAG BEFORE
MOVE T1,[-1,,T2] ;THE TASK IS QUEUED.
PUSHJ P,PUTMSG## ;IN THE TO PDP-11 QUEUE.
POPJ P,
PAGE
;TYPINP AND TYPOUT SERVICE ALL INPUT AND OUTPUT FOR BUFFERED
;LOCAL PDP-11 FRONT END DEVICES.
;THE DEVICES CAN BE RUN IN 2 MODES:
;1 MPX MODE. .TY MPX BIT IN DEVTYP DDB ENTRY IS ON.
;2 NOW MPX MODE. .TYMPX IS OFF:
;THE DIFFERENCE BETWEEN BOTH CASES IS THE FACT, THAT IN MPX MODE
;THE FIRST BUFFER WORD (THIRD OF BUFFER HEADER) SHOULD CONTAIN THE EXACT
;BYTE COUNT. IN NOW MPX MODE A WORD COUNT IS STORED HERE.
;IN THE INPACT CASE THE WORD SHOULD BE DERIVED FROM THE BUFFER HEADER
;AS THE USER COULD BUILD HIS OWN BUFFER STRUCTURE (WHICH CAN BE
;DISADVANTAGEOUS FOR FRONT END DEVICES AS BIG BUFFERS WOULD NEED.
;SERVERAL COPY PASSES BY THE PDP-11).
;WITH THE EXCEPTION OF THE WORD COUNT LOGIC ALL OPERATIONS NEEDED
;FOR I/O ARE SIMILAR. THIS FACT HAS BEEN USED BY INITIALIZING
;AN INPUT OPERATOR AND OUTPUT OPERATOR WITH THE LOADING OF THE
;PARAMETER SET CODE ADDRESS IN REGISTER U. AND CONFIRMING THEREAFTER
;WITH THE COMMON CODE IN TYPCOM
;LOGIC:
; U _ 'IF' INPUT 'THEM' INPCNT 'ELSE' OUTCNT;
; T1 _ NUMBER OF BYTES PER PDP-10 WORD:
; CALL .U ; 'COMMENT' T2 _ BUFFER WORD COUNT;
; T3 _ BUFFER BYTE COUNT;
; T4 _ ABSOLUTE BUFFER ADDRES 2;
;T2 _.ROT (.ROT(.T2, & 377,-8),-6)+.T4+2 ;'COMMENT' DL-10 POINTER
; T4 _ .SET DL-10 POINTER;
; SEND11 <DATREG, LINE, .T3, .T4);
; CALL SETACT:
PAGE
TYPINP: MOVEI U,INPCNT ;IN PUT PARAMETER SET UP:
PJRST TYPCOM ;GO TO COMMON CODE:
TYPOUT: MOVEI U,OUTCNT ;OUTPUT PARAMETER SET UP
; PJRST TYPCOM ;FALL INTO COMMON CODE:
TYPCOM: TLNN S,IOEND ;CALLED FROM INTERRUPT LEVEL WITH
TRNE S,740000 ; EOF OR ERROR BITS ON?
POPJ P, ;THEN IGNORE CALL
TLZE S,IOBEG ;IS THIS THE FIRST CALL??
PUSHJ P,TYPINI ;AND INIT DEVICE
IFN FTKL10,<
PUSHJ P,CSDMP## ;VALIDATE CORE
>
LDB T4,OLDBSZ ;GET THE BYTE SIZE FOR THE DEVICE
MOVEI T1,^D36 ;COMPUTE NUMBER OF BYTES PER WORD
IDIV T1,T4 ;AND LEAVE THE RESULT IN T1 TO
PUSHJ P,(U) ;ENABLE PARAMETER SET UP:
JUMPE T3,ADVBUF(U) ;IGNORE BUFFERS WITH ZERO BYTES
; PJRST STRT11 ;START UP THE PDP-11
PAGE
COMMENT &
THE DL-10 INTERFACE CAN TRANSFER UP TO ONLY 256 DECIMAL WORDS
PER NON IMMEDIATE BYTE POINTER.IN ADDITION TO THIS THE DATA
ADDRESSES HAVE TO BE CONTAINED IN A SINGLE PHYSICAL PAGE
PER BYTE POINTER.BOTH RESTRAINTS MAKE COMMON SOLUTION
POSSIBLE:
1 TRANSFER THE MINIMUM OF THE FOLLOWING QUANTITIES: .1 THE REMAINDER OF THE PHYSICAL PAGE IN WORDS FROMT THE
CURRENT BUFFER POSITION
.2 256 DECIMAL
.3 THE REMAININGPNUMBER OF WORDS TO BE TRANSFERRED
2 UPDATE NUMBER OF REMAINING WORDS, REMAING BYTES ANDNEXT BUFFER ADDRESS
THE TRANSFER PARAMETERS ARE STORED IN THE DDB.
1. A THE RIGHT HALF OF ENTRY DEVEXT IS THE CURRENT BUFFER ADDRESS
2. L THE LEFT HALF OF ENTRY DEVEXT IS THE NUMBER OF WORDS STILL TO
BE TRANSFERRED
3. B THE ENTRY DEVPPN THE NUMBER OF BYTES STILL TO BE TRANSFERRED
THE INITIAL PARAMETER SET UP IS DONE BY THE I/O OPERATOR
THE SETACT ROUTINE WILL RESET THE HUNGTIME,IN THIS WAY THE LONG BUFFERS
HAVE VERY LONG HUNG TIMES
& ;END OF COMMENT
PAGE
STRT11: TRO S,IOACT
LDB T3,OLDBSZ ;GET BYTE SIZE OF THE BUFFER
MOVEI T1,^D36 ;AND COMPUTE BUFFER LENGTH
IDIV T1,T3 ;#OF BYTES PER WORD
HRRZ T3,DEVEXT(F) ;GET TLE START ADDRESS OF THE XFER
ANDI T3,377 ;GET OFFSET IN CURRENT HALF PAGE
MOVEI T2,400 ;LENGHTH OF A HALF PAGE
SUB T2,T3 ;SO THIS NUMBER OF WORDS REMAINS IN PAGE
HLRZ T3,DEVEXT(F) ;THIS MANY STILL HAVE TO GO
CAMLE T2,T3 ;IS .R>.L ALL IN ONE PASS?
MOVE T2,T3 ;CERTAINLY
SUB T3,T2 ;AMOUNT FOR NEXT TRANSFER
HRLM T3,DEVEXT(F) ;SAVE IT IN DDB
HRRZ T4,DEVEXT(F) ;GET START OF DATA
ADDM T2,DEVEXT(F) ;NEXT STARTING ADDRESS
MOVE T3,T2 ;THIS MUCH WORDS GO
IMUL T3,T1 ;AND THIS MUCH BYTES ARE IN IT
CAMLE T3,DEVPPN(F) ;IS THIS MORE THAN REMAINDER?
MOVE T3,DEVPPN(F) ;YES THEN DO ONLY REMAINDER
SUBM T3,DEVPPN(F) ;UPDATE BYTE REMAINDER
MOVNS DEVPPN(F) ;AND MAKE IT POSITIVE
MOVNS T2 ;T2 IS NUMBER OF BUFFR WORDS
ANDI T2,377 ;CONVERTED TO DL10 WORD COUNT FORMAT
ROT T2,-^D8 ;MAKE FIRST TO BUILD DL-10 POINTER
CAIN T1,1 ;36 BITS IS IMAGE
MOVEI T1,3 ;WHICH HAS TO BYTES PER WORD
IORI T1,70 ;MAKE P FIELD -1 SO INCREMENT GENERATES 0
ADD T2,T1 ;NEXT ADD P=0 AND S FIELD
ROT T2,-6 ;AND MOVE ALL THREE FIELDS TO THE RIGHT
MAP T1,(T4) ;GET PAGE ADDRESS _F EXEC
LSH T1,^D9 ;SHIFT IT TO ADD IN OFFSET
ANDI T4,777 ;GET PAGE OFFSET
IORI T4,(T1) ;AND ADD EXEC PAGE
ADD T2,T4 ;PLACE AND ADD ABSOLUTE!!
PUSH P,T2 ;SAVE THE DL10 POINTER
PUSHJ P,MAPLIN ;GET COMTEX LINE # AND MAP ADDRESS
MOVE T4,PIO(J) ;GET ADDRESS OF BYTEPOINTER POOL
ADD T4,T2 ;ADD UP LINE NUMBER
SUB T4,NTT(J) ;BU MINUS DC76 LINES
POP P,(T4) ;AND SET THE POINTER
SUB T4,J ;TRANSLATE ADDRESS FOR PDP-11
MOVEI T2,<DATREQ>B27(T2) ;TO GIVE CONTEN LINE + FUNCTION
MOVE T1,[-3,,T2] ;PREPARE THE QUEING.
IORM S,DEVIOS(F) ;SET NEEDED BITS
PUSHJ P,PUTMSG## ;OF THE MESSAGE TO THE PDP-11
PJRST SETHNG## ;AND TELL THE SYSTEM THAT DEVICE IS ACTIVE
;TYPINI INITIALIZE A DEVICE, THIS MUST BE SUCCESSFUL
;IF IT IS NOT THEN THE SOFTWARE SYSTEM IS LEAKING OR THE DL-10 NEEDS A NEW MODULE.
;SO TRY IT:
TYPINI: PUSHJ P,GBYTSZ ;GET THE USER'S BYTE SIZE T4
LDB T2,PIOMOD## ;WHAT MODE IS USED??
CAIE T2,PIMMOD ;IF PIM THEN VERIFY BYTE SIZE
JRST BYTOKA ;ELSE BYTE IS OKAY
MOVE T2,[ POINT 5,BYTTAB] ;GET TABLE WITH VALID BYTE SIZES
BYTVER: ILDB T3,T2 ;GET A BYTE SIZE
JUMPE T3,ILLBYT## ;ILLEGAL BYTE SIZE
CAME T3,T4 ;EQUAL TO ONE GIVEN
JRST BYTVER ;NO GO ON VERIFYING
BYTOKA: DPB T4,OLDBSZ ;DTORE THE BYTE SIZE USED
PUSHJ P,MAPLIN ;MAP F TO A LINE NUMBER IN T2 AND SET]
CAML T2,MAX(J)
PJRST UNAVLT##
MOVEI T2,<DEVINI>B27(T2) ;GET COMMAND
MOVE T1,[-1,,T2] ;ONE WORD GOES
MOVEI S,IOACT ;AND FLAG DEVICE ACTIVE
IORM S,DEVIOS(F) ;BY SETTING FLAG IN CORE BEFORE PUTTING REQUEST
PUSHJ P,PUTMSG## ;TELL PDP-11 INIT REQUEST
PUSHJ P,WSYNC## ;WAIT FOR PDP-11
;RETURN HERE WHEN INIT FINISHED ON THE PDP-11
LDB T2,PBYTE ;GET INIT STATUS
CAIG T2,INIPDL-INIDSP
POP P,T1
PJRST @INIDSP(T2) ;DISPATCH TO ALL SPECIAL CASES
;READY IS CALLED WHEN THE INIT OPERATION EAS SUCCESFULL
READY: LDB T4,OLDBSZ ;GET BYTE SIZE TO BE USED
MOVEI T3,SETBYT ;AND GET SET BYTE SIZE CODE
MOVE S,[IOBEG,,IOACT] ;BITS WHICH HAVE TO BE ZEROED
ANDCAB S,DEVIOS(F) ;ZAP THAT'S IT
TRNE S,IONRCK ;DIAGNOSING THE LINE?
TRO T3,SETDIA ;(YES) TELL IT THE PDP-11
PUSHJ P,SNDSTS ;AND SET IT TO THE 11
LDB T4,OLDBSZ ;GET THE BYTE SIZE AGAIN
POPJ P,
OFFLIN: PUSHJ P,HNGSTP## ;ASK OPERATOR TO HELP USER
JRST TYPINI ;AND MAKE A RETRY
INIDSP: CMTERR## ;COMTEX ACCOUNTING HAS A HOLE
INIPDL: UNAVLT## ;DEVICE IS UNAVAILABLE
OFFLIN ;DEVICE IS OFFLIN
READY ;IOGO ALL IS SET UP NOW
INIMAX=.-INIDSP ;CHECK FOR LEGAL CODES
;BYTE SIZE VERIFICATION TABLE
BYTTAB: BYTE(5) 6,7,^D8,^D12,^D16,0 ;ZERO TERMINATES TABLE
OLDBSZ: POINT 6,DEVIOS(F),6 ;FIELD RESERVED FOR OLD BYTE SIZE
PAGE
;THE NEXT PAGE CONTAINS CODE , WHICH DIFFERS BETWEEN INPUT
;AND OUTPUT.THIS CODE IS CALLED DURING TYPCOM EXECUTION
;THERE ARE 3 SPECIAL CASES:
;0 CODE TO IGNORE BUFFERS FOR BUFFERS WITH A ZERO BYTE COUNT
;1 FIND ADDRES OF A BUFFER HEADER
;2 COMPUTE BYTE AND WORD COUNT FOR A USER FUFFER
;THE SPECIAL CASES ARE ADDRESSED BY MEANS OF BASE REGISTER U.
;CASE 0 IS AT OFFSET ADVBUF
;CASE 1 IS AT OFFSET BFHADR AND CASE2 AT OFFSET 0
;NOTE: THE OFFSET DEFINITIONS ARE MADE SUCH THAT THE OFFSETS ARE KNOWN ON PASS 2
;OUTCNT AND INCNT COMPUTE THE NUMBER OF :
;BYTES IN A TRANSFER (RESULT IS IN T3)
;WORDS NEEDED TO STORE THE BYTES (RESULT IN T2)
DUM1: PUSHJ P,ADVBFE## ;GET NEXT OUTPUT BUFFER
PJRST CLRACT## ;NO EXIT THEN
PJRST TYPOUT ;DO NEXT BUFFER
DUM2: HLRZ T3,DEVBUF(F) ;GET OBUF ADDRESS
OUTCNT:
;DEFINE OFFSETS SUCH THAT PASS 2 KNOWS THEM
ADVBUF=DUM1-OUTCNT ;OFFSET OF BUFFER ADVANCE CODE
BFHADR=DUM2-OUTCNT ;OFFSET OF PROPER BUFFER HEADER
MOVSI S,IO ;FLAG THAT JOB IS DOING OUTPUT
MOVEI T4,@DEVOAD(F) ;ADDRESS OF SECOND BUFFER WORD
MOVE T2,1(T4) ;GET NUMBER OF BYTES
LDB T3,PIOMOD## ;GET I/O M_DE
CAIE T3,PIMMOD ;PACKED IMAGE MODE
JRST NONPMO ;NO NON PIM MODE
IDIV T2,T1 ;/NUMBER OF BYTES PER WORD (T3
SKIPE T3 ;IS THERE A REMAINDER??
AOS T2 ;YES, ONE WORD MORE!!
MOVE T3,1(T4) ;NUMBER OF BYTES:
PJRST SETDDB ;BUILD THE CORRECT DDB
NONPMO: MOVEI T1,5 ;5 BYTES PER WORD FOR ASCII
CAILE T3,AL ;ASCII MODE=0,1
MOVEI T1,1 ;PDP11 WILL DO GOOD THINGS
MOVE T3,1(T4) ;GET THE NUMBER OF WORDS
MOVE T2,T3 ; AND COPY THEM
IMUL T3,T1 ;GET NUMBER OF BYTES
PJRST SETDDB ;FINISH THE DDB
IF2 <
IFN <ADVBUF-.+INPCNT>,<
PRINTX ADVBFF## MUST BE AT DISTANCE ADVBUF FROM LABEL INPCNT
>> ;END OF IFN END OF IF2
PUSHJ P,ADVBFF## ;GET NEXT INPUT BUFFER
PJRST CLRACT## ;CLEAR THE ACTIVITY FLAG
PJRST TYPINP ;DO NEXT BUFFER
IF2 <
IFN <BFHADR-.+INPCNT>,<
PRINTX ERROR HRRZ INSTRUCTION MUST BE AT OFFSET BFHADR FROM INPCNT
#$%&''()-:098 I ERROR TO STOP BATCH
> ;END OF IFN
> ;END OF IF2
HRRZ T3,DEVBUF(F) ;GET IBUF ADDRESS
INPCNT: SETZM S ;FLAG THAT INPUT IS BEING DONE
MOVEI T4,@DEVIAD(F) ;ADDRESS OF SECOND BUFFER WORD
HLRZ T2,(T4) ;NUMBER OF WORDS PER BUFFER.
TRZ T2,400000 ;CLEAR THE IOUSE BIT:
SUBI T2,1 ;DO NOT USE BYTE COUNT WORD
LDB T3,PIOMOD## ;GET DATA MODE
CAIE T3,PIMMOD ;PACKED IMAGE MODE
PJRST NONPMI ;NON PIM INPUT
MOVE T3,T2 ;NUMBER OF WORDS
IMUL T3,T1 ;TIMES # OF BYTES PER WORD=#OF BYTES PER BYTE
MOVEM T3,1(T4) ;SET BYTE COUNT FOR USER
PJRST SETDDB ;FINISH THE DDB
NONPMI: MOVEM T2,1(T4) ;NUMBER OF WORDS
MOVEI T1,5 ;5 BYTES PER WORD FOR ASCII
CAILE T3,AL ;IS IT ASCII
MOVEI T1,1 ;NO ONLY ONE PER WORD
IMUL T1,T2 ;GET NUMBER OF B2TES
MOVE T3,T1 ;COPY IT TO RIGHT ACCU
SETDDB: HRLM T2,DEVEXT(F) ;STORE THE NUMBER OF WORDS
MOVEM T3,DEVPPN(F) ;AND THE NUMBER OF BYTES
ADDI T4,2 ;SKIP BUFFER HEADER PART
HRRM T4,DEVEXT(F) ;AND STORE THE DATA ADDRESS
POPJ P,
PAGE
;CHKUP IS USED WHEN MESSAGES HAVE TO BE SENT FROM UUO LEVEL
;TO THE PDP-11. WHEN THE PDP-11 IS DOWN AN NORMAL RETURN IS GIVEN
;ELSEWHISE A SKIP RETURN IS GIVEN. OTHER LEVELS CAUSE A HUNG DEVI
;STATUS, WHICH BY CALLING THE RELEASE OPERATOR WILL CAUSE THE
;IOACT STATUS TO BE CLEARED
CHKUP: PUSHJ P,MAPLIN ;GET LINE DATA
SKIPLE DWN(J) ;IS PDP-11 NOT RUNNING
JRST CPOPJ1## ;NO GIVE RUN RETURN
MOVE S,[WTRELB,,IOACT] ;IMPORTANT BITS
ANDCAM S,DEVIOS(F) ;WHICH SHOULD BE CLEARED
POPJ P,
;CHK11 IS CALLED FROM THE INIT UUO TO CHECK IF THE DC44
;IS RUNNING. WHEN IT IS CALLED THE ASSPRG BIT HAS
;BEEN SET IN DEVMOD. THIS BIT WILL BE CLEARED TO PREVENT
;FAILURE OF DVASRC FOR (E.G.) PAP DEVICE
CHK11: PUSHJ P,CHKUP ;IS PDP-11 RUNNING
SKIPA ;(NO)ABOUT INIT
PJRST REGSIZ## ;REGULAR METHOD
MOVEI T1,ASSPRG ;CRITICAL BIT
ANDCAB T1,DEVMOD(F) ;SO GENERIC SEARCH FINDS IT
SETZ T2, ;ZERO JOV NUMBER
TRNN T1,ASSCON ;IF ONLY ASSIGNED BY PROGRAM
DPB T2,PJOBN## ;RELEASE THE DEVICE
PJRST DWND44## ;COMPLAIN
;MAPLIN LOADS REGISTER T=J WITH THE BASE ADDRESS OF THE DL-10 MAP
;AND LOADS THE COMTEX LINE NUMBER IN T2
MAPLIN: LDB T2,PBYTE1 ;LOAD THE MAP NUMBER
MOVE J,@DLXBAT##(T2) ;GET DL10 MAP ADDRESS:
HRRZ T2,DEVFIL(F) ;GET COMTEX LINE NUMBER
ADD T2,NTT(J) ;CHANGE TO COMTEX LINE NUMBER
POPJ P, ;AND RETURN:
;BUFFER HEADER
GBYTSZ: XCT BFHADR(U) ;GET THE RIGHT ADDRESS
ADDI T3,1 ;POINT TO POINTER
EXCTUX <MOVE T3,@T3> ;GET USER'S BYTE SIZE
LDB T4,PBYTSZ ;GET BYT SIZE
POPJ P,
PAGE
;D76INT CALLS ROUTINES OUT THE FOLLOWING PAGES WHEN A
;DL-10 QUEUE ENTRY FOR THIS SERVICE WAS DISCOVERED:
;WHEN CALLED:
;U CONTAIN S THE LINE INDEX FOR LINTAB
;H ADDRESS OF DL-10 MAP:
;DATDON IS CALLED WHEN A LINE HAS FINISHED A DATA TRANSFER:
;INTO A PDP-10 INPUT BUFFER. IN ADDITION TO THE DONE MESSAGE
;A MESSAGE COUNT IS TRANSMITTED. THERE ARE 2 POSSIBILITIES:
;1. THE MESSAGE COUNT IS EQUAL TO THE AMOUNT REQUESTED:
;2. THE AMOUNTS DIFFER, WHICH MEASN ERRORS ON EOF
;CASE 2 HOWEVER MANIFESTS IT SELF IN A SPERATE QUEUE MESSAGE, WHICH
;WILL SIMPLIFY COMMAND DECODING:
DATDON:: PUSHJ P,SETUP3 ;INITIALIZE S,F AND DATA WORD
POPJ P, ;IGNORE THIS
MOVSI T2,DVIN ;CAN DEVICE DO INPUT??
TDNN T2,DEVMOD(F) ;IF NOT THEN
POPJ P, ;EXIT AND FORGET MESSAGE
MOVEI T2,@DEVIAD(F) ;GET BUFFER ADDRESS
JUMPE T1,DATDO0 ;ALL IS FINE NO PROBLEMS
;AS DC44 BUFFERS ARE PAGED DURING TRANSFERS THE NUMBER OF
;BYTES NOT TRANSFERRED HAS TO BE INCREASED WITH THE NUMBER
;OF BYTES REMAING IN THE LAST BUFFER PAGES .DEVPPN(F)
PUSHJ P,STATUS ;ANALIZE
ADDM T3,DEVPPN(F) ;GET THE BALANCE
PUSHJ P,CHKPIM## ;CHECK IF PIM MODE
JRST DATDO1 ;THEN ALL IS OKAY
MOVEI T3,^D36 ;AND GET # OF BYTES PER WORD
LDB T4,OLDBSZ ;GET THE BYTE SIZE
IDIV T3,T4 ;NOTE NO ROUNDING NOW
MOVE T4,T3 ;GET IN CORRECT ACCU
MOVE T3,DEVPPN(F) ;GET THE REST
IDIV T3,T4 ;AND GET REMAINDER
DATDO1: SUBM T3,1(T2) ;THAT'S ALL YOU GOT
MOVNS 1(T2) ;BUT PASS THE RIGHT AMOUNT
TLO S,IOEND ;FLAG THE END OF FILE
DATDO0: PUSHJ P,CHKPAG ;CHECK IF MORE PAGES HAVE TO GO
PJRST STOIOS## ;WAIT TILL ALL PAGES ARE TRANSFERRED
IFN FTKL10,<
PUSHJ P,CSDMP## ;VALIDATE CORE
>
PUSHJ P,MAKRUN ;THEN MAKE HIM RUNNABLE AGAIN
PUSHJ P,ADVBFF## ;AND SEE IF THERE ARE MORE BUFFERS
PJRST STOIOS## ;NO, UPDATE DEVIOS
MOVEM S,DEVIOS(F) ;STORE UPDATED IOS.
PJRST TYPINP ;YES, MAKE AN INPUT OPERATION AND
PAGE
;SETUP3,SETUP2 AND SETUP1 ARE ROUTINES CALLED WHEN RESPECTIVELY:
;3,2,1 WORDS WERE STORED IN THE PDP-11 TO PDP-10 QUEUE FOR THE CALLING
;COMMAND.CALLING THE SETUP ROUTINE SPECIFIC FOR A COMMAND GUARANTEES THE INTEGRITY
;OF THE QUEUE.
;QUEUE ENTRIES RETURNED:
;1 SETUP1 NONE
;2 SETUP2 IN T1
;3 SETUP3 ARGUMENT1 IN T3,ARGUMENT 2 IN T1
;ALL ROUTINES GIVE 2 RETURNS:
;NORMAL RETURN IGNORE ALL QUEUE ENTRIES UNTIL A DEVICE RELEASE SUCCEEDS
; FOR THE ASSOCIATED LINE
;SKIP RETURN PROCES QUEUE ENTRY
;IN ADDITION THE FOLLOWING REGISTERS WILL BE SETUP:
;S CONTAINS DEVIOS OF DDB
;F DDB ADDRESS OF LINE
SETUP3: PUSHJ P,GTMSGH## ;GET FIRST OPERAND
PUSH P,T1 ;AND SAVE IT
PUSHJ P,SETUP2 ;TAKE NOW THE SECOND ARGUMENT IN T1
JRST TPOPJ## ;IGNORE THE ENTRY EXET
POP P,T3 ;GET THE FIRST ARGUMENT
JRST CPOPJ1## ;AND ALL IS OKAY
SETUP2: PUSHJ P,GTMSGH## ;GET THE QUEUE ENTRY IN T1
; PJRST SETUP1 ;DO COMMON THINGS
IF2 <
IFN <.-SETUP1>,<
PRINTX DO NOT INSERT CODE BETWEEN SETUP2 AND SETUP1
PJRST SETUP1 ;GENERATE A PHASE ERROR
> ;END OF IFN CONDITION
> ;END OF IF2 CONDITION
SETUP1: SUB U,LTO(J) ;REDUCE U TO OUR WORLD
CAMG U,MAX(J) ;IS LINE NUMBER VALID??
JRST LINEOK ;YES IT IS OKAY
AOS TRBLE ;INCREASE TROUBLE COUNTER
POPJ P, ;IGNORE UNAVAILABLE
LINEOK: SUB U,NTT(J) ;GET PDP DDB INDEX
MOVE F,DC40TB##(U) ;GET DDB ADDRESS BUILT BY LINKSR!!!
MOVE S,DEVIOS(F) ;GET IOS BITS.
TLNE S,WTRELB ;IS RELEASE PENDING?
POPJ P, ;YES IGNORE ALL UNTIL RELEASE OAKY
PJRST CPOPJ1##
PAGE
;DATREL IS RECEIVED IN RESPONSE TO A DEVICE RELEASE REQUEST.
;ITS TASK IS TO QUARANTEE, THAT THE T010 QUEUER IS OPENED AGAIN FOR
;TRAFFIC FOR THE DEVICE CONSERVED:
DATREL::PUSHJ P,SETUP2 ;IGNORE, IGNORE STATUS:
TLZN S,WTRELB ;ARE WE WAITING YES!!!
JRST FAILRL## ;NO SHOULD BE SO!!!
JUMPE T1,FAILRL## ;THE RELEASE FAILED
PJRST STOIOS## ;ALL IS OKAY
PAGE
;TYPSTS IS CALLED WHEN STATUS INFORMATION FROM THE PDP-11
;THE FOLLOWING STATUS CAN BE PASSED:
;1 DEVICE ERROR (ACCOMPLANIED BY EOF)
;2 EOF FLAG CONFIRMS POSSIBLE CLOSE OUTPUT:
;3 OUTPUT FINISHED:
;NO OTHER STATUS TRANSFERS
TYPSTS::PUSHJ P,SETUP2 ;SET UP STANDARD DATA:
POPJ P, ;IGNORING ALL DATA FOR THIS LINE
TRZE T1,EOFFLG ;IF END OF FILE NOT SEEN THEN
TLO S,IOEND ;AND USER SHOULD KNOW IT FOR INPUT
TRZE T1,BADSTS ;ANY ERRORS SEEN
TRO S,IODERR ;YES FLAG THEM
MAKRUN: TRZ S,IOACT ;ALL CALLERS RESET IT
PUSHJ P,SETIOD## ;MAKE HIM RUNNABLE
PJRST STOIOS## ;NO GO AND STORE UPDATED IOS
PAGE
;DATCOP IS CALLED WHEN AN OUTPUT BUFFER HAS BEEN TRANSMITTED
;TO THE ADDRESSED DEVICE . IN T1 WILL BE THE TRANSFER STATUS AFTER
;THE SETUP3 CALL AND IN T1 WILL BE THE NUMBER OF UNTRANSFERRED BYTES
DATCOP:: PUSHJ P,SETUP3 ;SET UP FOR 3 WORDS MESSAGE
POPJ P, ;IGNORING ALL QUEUE ENTRIES FOR LINE
JUMPE T1,DATCO0 ;ALL WENT
PUSHJ P,STATUS ;ANALIZE ERROR STATUS
DATCO0: PUSHJ P,CHKPAG ;CHECK FOR MORE PAGES
PJRST STOIOS## ;WAIT TILL ALL PAGES WENT
PUSHJ P,MAKRUN ;MAKE JOB RUNNABLE AGAIN
PUSHJ P,ADVBFE## ;ARE THERE MORE BUFFERS
PJRST STOIOS## ;NO FORGET IT
MOVEM S,DEVIOS(F) ;UPDATE IOS E.G. IOW ZERO!!
PJRST TYPOUT ;AND OUTPUT NEXT BUFFER
;CHKPAG CHECK IF MORE PAGES HAVE TO GO T1 CONTAINS
;TRANSFER STAUS ON ENTRY IGNORE REST OF PAGES FOR
;DEVICES WITH ERRORS
CHKPAG: JUMPN T1,CPOPJ1## ;IGNORE ERRORS
HLRZ T1,DEVEXT(F) ;RESTING BUFFER LENGTH
JUMPE T1,CPOPJ1## ;ALL DONE FOR THIS BUFFER
PJRST STRT11 ;RESTART PDP-11
;STATUS IS CALLED WITH THE PDP-11 ERROR STATUS
;IN REGISTER T1
;DIASTS MEANS A LINE IN 100(IORRCK) DETECTED
;AN ERROR AT INTERRUPT LEVEL SETS IODTER
;DIAEXC MEANS A LINE IN IONRCK MODE DETECTED
;AN ERROR AT EXEC LEVEL SETS IOBKTL
;IODERR IS SET ALWAYS:
STATUS: TRNE T1,DIASTS ;INTERRUPT LEVEL?
TRO S,IODTER ;(YES) TELL IT THE USER
TRNE T1,DIAEXC ;EXEC LEVEL?
TRO S,IOBKTL ;(YES) FLAG IT
TRNE T1,BADSTS ;ANY ERRORS?
TRO S,IODERR ;SET ALWAYS
POPJ P, ;RETURN
INITRT:: PUSHJ P,SETUP2 ;GET INIT STATUS
POPJ P, ;ILLEGAL LEGAL LINE NUMBER
CAIL T1,INIMAX ;IS THE CODE LEGAL??
SETZ T1, ;FLAG THAT PDP-11 IS CONFUSED
DPB T1,PBYTE ;LET UUO LEVEL HANDLE PROBLEMS
PJRST MAKRUN ;AND LET JOB RUN AGAIN
COMMENT &
WHEN THE PDP11 GOES DOWN THERE CAN BE DEVICES
ACTIVE WHICH HAVE THE E. G. THE WTRELB BIT SET,THERE IS A RACE
CONDITION WHEN A DEVICE HANDS DUE TO A CRASHED PDP 11 AND CALLED
TYPHNG BEFORE THE D76DWN DODE DISCOVERED THE DISASTER. TO PREVENT
PROBLEMS OF THIS TYPE THE FOLLOWING LOGIC IS USED:
1 ALL UUO CODE DOES CHECKS WHETHER THE PDP-11 IS UP AND IF THE
STATUS IS STILL UP THEN IT SIMPLY SUBMITS ITS MESSAGES
EVEN THOUGH THE PDP-11 MIGHT BE DOWN AT THE MOMENT
2 WHEN THE DL-10 TIMER FLAGS A DL10 AS DOWN IT CALLS D44DWN
TO SCAN ALL THE DC44 DEVICES TO BE SURE THAT THERE WILL BE NO PROBLEMS
&
D44DWN::PUSHJ P,SAVE2## ;GET SOME SPARE ACCUS
MOVE P1,MAX(J) ;GET NUMBER OF LINES ON THIS FRONT END
SUB P1,NTT(J) ;ARE THERE DC44 LINES??
JUMPLE P1,CPOPJ## ;NO ONE THERE
MOVEI P2,DC40TB## ;GET LIST OF DDB'S FOR THIS DC44
PUSH P,F ;SAVE F FOR CALLER
PUSH P,S ;SAVE S FOR SOMEBODY ELSE
D44DW0: MOVE F,(P2) ;GET THE DDB ADDRESS
MOVE S,DEVIOS(F) ;GET I/O STATUS
TLZE S,WTRELB ;HAS A HUNG DEVICE BEEN CAUGHT?
TRZA S,IOACT ;CLEAR IOACT
TRNN S,IOACT ;IS DEVICE ACTIVE
AOJA P2,D44DW1 ;NO FLAGS SET
MOVEI S,1 ;TAKE LOWEST HUNG TIME
DPB S,PDVCNT## ;AND HANG DEVICE KNOWING DC44
AOSA P2 ;IS DOWN, TAKE NEXT DEVICE
D44DW1: MOVEM S,DEVIOS(F) ;UPDATE STATUS
SOJG P1,D44DW0 ;TAKE NEXT DEVICE
POP P,S ;AND S BACK
POP P,F ;GET F
POPJ P,
;CONSTANTS:
PBYTSZ: POINT 6,T3,11 ;POINTER TO BYTE SIZE
IFGE <INIMAX-10>,<
PRINTX PBYTE SHOULD BE UPDATED AS ONLY 3 BITS ARE RESERVED
PRINTX AND MORE THAN 3 ARE NEEDE FOR INIDSP
>
PBYTE: POINT 3,DEVFIL(F),2 ;THE LEFT MOST 3 BITS
PBYTE1: POINT 2,DEVFIL(F),17 ;THE DL10 PORT NUMBER
$LOW
TRBLE: EXP 0 ;COUNTER OF INVALID PDP-11 LINES
$LIT
END