perm filename IMPINT.MAC[IP,NET] blob
sn#702345 filedate 1983-03-11 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00013 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 TITLE IMPINT HARDWARE/SOFTWARE INTERFACE V 1515/515
C00005 00003 LOCAL REVISION HISTORY
C00007 00004 ENTRY IMPINT IMPINT
C00009 00005 DOCUMENTATION
C00012 00006 EXTERNAL ROUTINES:
C00015 00007 PARAMETERS IMP POWER DOWN10 SICK DEAD ENDIN EMPTY FULL CSICK DOWN10 OUTSTP OUTEND GOTEND MPEENB MPPENB MPIENB ALLENB MPISET MPESET MPPSET IMP TYHB RFNHB TEST IMPERR IDONE IEND ODONE NREADY IEPIA IDPIA ODPIA TEST STRIN I32 O32 CLRST CLRWT STROUT FINO IEPIEN IDPIEN ODPIEN PIA ISTART IFLUSH SICK FULL ENDIN EMPTY OUTEND
C00022 00008 SUBTTL INTERRUPT CODE MPIINT MPIIN1 ONEWRD MPIIN2 IGNORE
C00026 00009 MPE INTERRUPT SERVICE -- END-OF-MESSAGE MPEINT END2 END3
C00029 00010 MPP INTERRUPT SERVICE -- OUTPUT TO IMP MPPINT DONE NONE
C00032 00011 SUBROUTINES IMPOUT IMPOU1 IMPOU2
C00035 00012 CODE TO CHECK HARDWARE HEALTH IMPCHK
C00037 00013 INITIALIZE DEVICES IMPDWN IMPIOF IMPION BLKIPT INPON DUMMY BLKOPT OUTACT
C00039 ENDMK
C⊗;
TITLE IMPINT HARDWARE/SOFTWARE INTERFACE V 1515/515
SUBTTL SUNDBERG/RLS/EAT -- 22-APR-73
SEARCH F,S ;MACRO V50
$RELOC
$LOW
XP VIMPNT,516 ;5.06 VERSION = 1000+5.04 VERSION
;JJW revised March '83 for WAITS IP/TCP.
;Code marked NOWAITS is TOPS-10 code not used in WAITS. Code marked IFWAITS or
;IFE FTF2 is new WAITS code. Code marked IFN FTF2 but not IFWAITS is used in
;TOPS-10 and F2 WAITS.
;LOCAL REVISION HISTORY
;[96bit] 7-Jul-80, Jim McCool
; Modules effected: S, COMDEV, I, IMPINT, IMPSER, NETCON
; Edit type: Enhancement
; Add the CMU modifications to the ARPAnet code to support
; 96 bit leaders in the HOST-IMP protocol
;END OF LOCAL REVISION HISTORY
ENTRY IMPINT ;⊗ IMPINT
IMPINT::
; BECAUSE OF ASSEBLY-TIME ERROR IN COMMON (MACRO BUG), ALL MPO...
; VALUES AND LABELS HAVE BEEN CHANGED TO MPP... DK/FEB 75
COMMENT \
INPUT INTERRUPT CHANNEL MUST BE HIGHER PRIORITY THAN
END-OF-MESSAGE CHANNEL
\
IFWAITS<
;The above warning is not heeded: in COMMON.MAC all IMP interrupts are
;assigned to the same channel. We'll do the same in WAITS, with the channel
;number defined in CACDAT.
MPI==IMPCHN##
MPE==IMPCHN##
MPP==IMPCHN##
>;IFWAITS
SUBTTL DOCUMENTATION
COMMENT \
INTERNAL ROUTINES:
IMPDWN-- TURNS THE HARDWARE OFF AND SETS PDP10 DOWN BIT
IMPIOF-- TURNS OFF INPUT
IMPION-- TURNS ON INPUT
IMPCHK-- CHECKS THE STATUS OF THE HARDWARE. THE RETURN ADDRESS
DEPENDS ON THE STATUS. NO SKIP MEANS THAT THE IMP
IS DEAD. ONE SKIP MEANS THAT IT WAS DEAD BUT IS
APPARENTLY OK NOW. A DOUBLE SKIP MEANS THAT THE
PDP-10 IS QUESTIONABLE. A TRIPLE SKIP MEANS THAT ALL
IS OK.
IMPOUT-- ROUTINE TO START UP THE OUTPUT SECTION. T1 MUST
CONTAIN AN IOWD POINTER TO AN OUTPUT MESSAGE. RETURNS
IMMEDIATELY IF THE HARDWARE IS BUSY AND THE MESSAGE
CANNOT BE TRANSMITTED. THE SKIP RETURN IS TAKEN
IF THE MESSAGE IS BEING TRANSMITTED.
EXTERNAL ROUTINES:
IMPEOM-- CALLED WHEN END-OF-MESSAGE HAS BEEN TRANSMITTED.
IF THERE IS NO MORE OUTPUT, RETURN WITH A POPJ P,.
IF ANOTHER MESSAGE IS TO BE TRANSMITTED, PLACE THE IOWD
POINTER IN T1 AND TAKE THE SKIP RETURN.
IMPOND-- CALLED UPON A RUNOUT OF THE BLKO POINTER. TO APPEND
MORE OUTPUT, RETURN A NEW IOWD POINTER IN T1. OTHER-
WISE, DO NOT ALTER T1.
IMPIN-- CALLED ON THE FIRST WORD OF AN INCOMING MULTIWORD
MESSAGE. T1 CONTAINS THE FIRST WORD. RETURN WITH
A POPJ P, AND T1 LOADED AS FOLLOWS:
IF THE ENTIRE MESSAGE IS TO BE INPUT, T1 SHOULD
CONTAIN A LEGAL IOWD POINTER.
IF THE MESSAGE IS TO BE IGNORED, T1 SHOULD CONTAIN
ANY POSITIVE NUMBER.
IF IT IS DESIRED THAT IMPIN(OR IMPONE, BELOW) BE
CALLED ON THE NEXT INPUT WORD, T1 SHOULD
BE ZEROED.
IMPEIM-- CALLED WHEN AN END-OF-MESSAGE HAS BEEN RECEIVED. T1
CONTAINS THE CURRENT BLKI POINTER.
RETURNS NON-SKIP ALWAYS.
IMPIND-- CALLED WHEN A SUPPLIED INPUT IOWD POINTER RUNS OUT.
THE OLD POINTER(EXPIRED) IS IN T1 (SEE IMPEIM). RETURN WITH
A POPJ P, WITH T1 LOADED AS IN IMPIN, ABOVE.
\
SUBTTL PARAMETERS ;⊗ IMP POWER DOWN10 SICK DEAD ENDIN EMPTY FULL CSICK DOWN10 OUTSTP OUTEND GOTEND MPEENB MPPENB MPIENB ALLENB MPISET MPESET MPPSET IMP TYHB RFNHB TEST IMPERR IDONE IEND ODONE NREADY IEPIA IDPIA ODPIA TEST STRIN I32 O32 CLRST CLRWT STROUT FINO IEPIEN IDPIEN ODPIEN PIA ISTART IFLUSH SICK FULL ENDIN EMPTY OUTEND
;HARDWARE DEFINITIONS
IFN FTF2,<
;It so happens that the F2 interface for WAITS is the same as the TOPS-10
;standard, except for the names of the CONI and CONO bits.
IMP== 550 ;IMP DEVICE NUMBER
;CONI BITS
POWER== 200000 ;IMP INTERFACE TURNED ON
DOWN10==100000 ;PDP-10 WAS DOWN
SICK== 40000 ;IMP WAS DOWN
DEAD== 20000 ;IMP CURRENTLY DOWN
ENDIN==: 4000 ;EOM RECEIVED
EMPTY==: 200 ;OUTPUT BUFFER EMPTY
FULL==: 10 ;INPUT BUFFER FULL
;CONO BITS
CSICK== 200000 ;CLEAR SICK FLAG
DOWN10==100000 ;PDP-10 IS UNHEALTHY
OUTSTP== 40000 ;CLEAR EMPTY FLAG
OUTEND== 20000 ;SEND EOM
GOTEND== 10000 ;ACKNOWLEDGE INPUT EOM
MPEENB== 4000 ;ENABLE PI FIELD FOR ENDIN INTERRUPT
MPPENB== 200 ;ENABLE PI FIELD FOR OUTPUT INTERRUPT
MPIENB== 10 ;ENABLE PI FIELD FOR INPUT INTERRUPT
MPEPIA== 3400 ;Endin PI channel bits
MPPPIA== 160 ;Output PI channel bits
MPIPIA== 7 ;Input PI channel bits
>;IFN FTF2
IFE FTF2,<
;For the SU-AI interface, we first define an old set of names, and then
;define the equivalent TOPS-10 names.
IMP== 400 ; Device number
; CONI bits
TYHB== 400000 ; There's Your Host Bit
RFNHB== 200000 ; Ready For Next Host Bit
TEST== 100000 ; Interface is in test mode
IMPERR==040000 ; IMP error (the READY line has gone down)
IDONE== 020000 ; Input done
IEND== 010000 ; Input end (end of message)
ODONE== 004000 ; Output done
NREADY==002000 ; IMP not ready if ¬TEST (actually ¬TEST∧¬READY)
IEPIA== 000700 ; input end PI channel
IDPIA== 000070 ; input done PI channel
ODPIA== 000007 ; output done PI channel
; CONO bits
TEST== 100000 ; Enter test mode. In test mode the output side is
; tied to the input side of the interface, and READY
; is brought down
STRIN== 040000 ; Start input, sets stop, clears IEND.
; Stop means enable wait. Wait happens after the
; last bit has come in (if enabled by "stop") to
; allow the programmer to change data modes before
; the first bit of the next word comes in
I32== 020000 ; Set 32. bit input mode if IDPIEN set
O32== 010000 ; Set 32. bit output mode if ODPIEN set
CLRST== 004000 ; Clear stop
CLRWT== 002000 ; Clear wait
STROUT==000200 ; Start output
FINO== 000100 ; Finish output (last bit has been sent)
IEPIEN==000040 ; Enable change of IEPIA
IDPIEN==000020 ; Enable change of input byte size and IDPIA, clear
; IMPERR
ODPIEN==000010 ; Enable change of output byte size and ODPIA
PIA== 000007 ; PI channel (see IEPIEN, IDPIEN, ODPIEN)
ISTART==STRIN!CLRWT!IEPIEN!IDPIEN!IMPCHN
IFLUSH==TEST!IEPIEN!IDPIEN!ODPIEN ;stop the IMP, turn off PIAs
SICK== IMPERR ;Equivalents
FULL==: IDONE
ENDIN==:IEND
EMPTY==:ODONE
MPIPIA==IDPIA
MPEPIA==IEPIA
MPPPIA==ODPIA
OUTEND==FINO
IFE FTIMP32,<
MPIENB==IDPIEN ;Sets 36-bit input
MPPENB==ODPIEN ;Sets 36-bit output
>;IFE FTIMP32
IFN FTIMP32,<
MPIENB==IDPIEN!I32
MPPENB==ODPIEN!O32
>;IFN FTIMP32
MPEENB==IEPIEN
>;IFE FTF2
ALLENB==MPIENB+MPPENB+MPEENB
MPISET==MPIENB+MPIPI## ;SETS THE INPUT CHANNEL
MPESET==MPEENB+MPEPI## ;SETS E-O-M CHANNEL
MPPSET==MPPENB+MPPPI## ;OUTPUT CHANNEL
;MACRO TO DISMISS INTERRUPTS IN VARIOUS WAYS
DEFINE JMPENB(CH) <
JEN @CH'CHL##
>
SUBTTL INTERRUPT CODE ;⊗ MPIINT MPIIN1 ONEWRD MPIIN2 IGNORE
;MPI INTERRUPT SERVICE -- INPUT FROM IMP
NOWAITS<
MPIINT::CONSO IMP,FULL ;IMP INPUT?
JRST .-1
>;NOWAITS
IFWAITS<
MPIINT::CONSO IMP,MPIPIA ;Any input channel?
JRST IMPETS## ;Nope, not IMP input interrupt
>;IFWAITS
MPIIN1: SKIPL BLKIPT ;GOOD BLKI?
JRST ONEWRD ;NO
BLKI IMP,BLKIPT ;READ
SKIPA
JMPENB (MPI) ;DISMISS
JSR MPISAV## ;COUNTED OUT
MOVE T1,BLKIPT
CONSZ IMP,ENDIN ;WAS IT THE LAST ANYWAY?
JRST END2 ;YES
PUSHJ P,IMPIND## ;NO. TELL OF RUNOUT
JRST MPIIN2 ;STORE NEW POINTER AND RESUME INPUT
;EITHER FIRST INPUT OR THROWING AWAY DATA
ONEWRD:
conso imp,endin ;[96bit] EOM already on? (1 word long)
SKIPE BLKIPT ;FIRST?
JRST IGNORE ;NO
;[96bit] no one word messages.
;[96bit]CONSZ IMP,ENDIN ;EOM SEEN? (MUST TEST BEFORE DATAI)
;[96bit]JRST ONEIN ;YES
JSR MPISAV##
DATAI IMP,T1 ;GET LEADER
PUSHJ P,IMPIN## ;EXCHANGE FOR BLKI POINTER
MPIIN2: MOVEM T1,BLKIPT
;[96bit] nobody ever uses this information.
;[96bit]SETZM OVERFL ;CLEAR OVERFLOW COUNTER
;[96bit]SKIPLE T1 ;DISCARDING NEXT INPUT?
;[96bit]AOS OVERFL ;YES, START COUNT
POPJ P,
IGNORE: DATAI IMP,DUMMY ;THROW AWAY OVERFLOW DATA
JMPENB (MPI) ;DISMISS
;MPE INTERRUPT SERVICE -- END-OF-MESSAGE ;⊗ MPEINT END2 END3
NOWAITS<
MPEINT::CONSO IMP,ENDIN ;IMP END OF INPUT?
JRST .-1
>;NOWAITS
IFWAITS<
MPEINT::CONSO IMP,MPEPIA ;Any input-end channel?
JRST IMPOTS## ;Nope, not an input-end interrupt
>;IFWAITS
CONSZ IMP,FULL ;YES, DID INPUT FLAG COME UP JUST NOW?
JRST MPIIN1 ;YES, HANDLE IT FIRST
JSR MPESAV##
;[96bit]SKIPL T1,BLKIPT ;UNDERFLOW?
;[96bit]HRL T1,OVERFL ;NO. PERHAPS OVERFLOW
skipge t1,blkipt ;[96bit] load t1, skip if ingoring input
END2: PUSHJ P,IMPEIM## ;TELL IMP SERVICE
SETZM BLKIPT ;READY FOR NEXT INPUT MESSAGE
;[96bit]SETZM OVERFL
END3:
IFN FTF2,<
CONO IMP,GOTEND ;RESUME INPUT
>;IFN FTF2
POPJ P,
;[96bit] imp-host messages no longer fit in one word: handle
; like buffered input.
;ONEIN: DATAI IMP,T1 ;GET LEADER
;[96bit]PUSHJ P,IMPONE## ;SEND MESSAGE TO IMPSER
;[96bit]JRST END3
;MPP INTERRUPT SERVICE -- OUTPUT TO IMP ;⊗ MPPINT DONE NONE
NOWAITS<
MPPINT::CONSO IMP,EMPTY ;IMP OUTPUT?
JRST .-1
>;NOWAITS
IFWAITS<
MPPINT::CONSO IMP,MPPPIA ;Any channel?
JRST IMPCTS## ; nope, can't be interrupting
>;IFWAITS
SKIPL BLKOPT ;LEGIT IOWD?
JRST DONE ;NO
BLKO IMP,BLKOPT ;YES
JRST .+2 ;BLKO RUNOUT
JMPENB (MPP) ;DISMISS
JSR MPPSAV##
MOVE T1,BLKOPT
PUSHJ P,IMPOND## ;RETURN ANOTHER BLKO POINTER
MOVEM T1,BLKOPT
POPJ P, ;DISMISS INTERRUPT
DONE: SKIPG BLKOPT ;CLEARED?
JRST NONE ;YES
JSR MPPSAV## ;NO
CONO IMP,OUTEND ;SEND EOM
PUSHJ P,IMPEOM## ;TELL IMP SERVICE
SETZ T1, ;QUEUES ARE EMPTY
MOVEM T1,BLKOPT
POPJ P, ;DISMISS
NONE: SETZM OUTACT ;SET INACTIVE
IFN FTF2,<
CONO IMP,OUTSTP ;STOP HARDWARE
>;IFN FTF2
JMPENB (MPP) ;DISMISS
;LEGAL FLAG STATES:
;BLKOPT: -, +, 0, 0
;OUTACT: -1, -1, -1, 0
;STATE NUMBER: 1, 2, 3, 4
; 1. NORMAL TRANSMISSION IN PROGRESS. OUTPUT REQUESTS
; MUST BE QUEUED.
; 2. OUTPUT BLOCK DONE. EOM ON NEXT INTERRUPT. OUTPUT
; REQUESTS MUST BE QUEUED.
; 3. STOPPING. QUEUES WERE EMPTY. OUTPUT REQUEST MAY
; BE DEPOSITED DIRECTLY IN BLKOPT.
; 4. INACTIVE. HARDWARE MUST BE RESTARTED ON OUTPUT
; REQUESTS.
SUBTTL SUBROUTINES ;⊗ IMPOUT IMPOU1 IMPOU2
;HERE TO OUTPUT A BLOCK TO THE IMP
;INTERRUPTS MUST BE DISABLED
;CALL:
; MOVE T1,[IOWD LENGTH,ADDRESS]
; PUSHJ P,IMPOUT
; RETURN HERE IF MUST QUEUE
; HERE IF OUTPUT STARTED
IMPOUT::consz pi,impbts## ;(debug) are the IMPs enabled?
stopcd .+1,DEBUG,IDE ;(debug) imps dangerously enabled.
SKIPE BLKOPT ; ALREADY OUTPUTTING?
POPJ P, ;YES.
JUMPGE T1,CPOPJ1## ;PRETEND OK IF NOTHING THERE
SKIPE OUTACT ;ACTIVE?
JRST IMPOU2 ;YES, JUST STORE NEW BLKOPT
SETOM OUTACT ;FLAG ACTIVE
blko imp,t1 ;[96bit] output the first word
jrst cpopj1 ;[96bit] should never be here, ever.
IMPOU1: CONO IMP,MPPSET ;ENABLE OUTPUT HARDWARE
IMPOU2: MOVEM T1,BLKOPT ;STORE NEW IOWD
JRST CPOPJ1 ;SKIP RETURN
;CODE TO CHECK HARDWARE HEALTH ;⊗ IMPCHK
;CALL:
; PUSHJ P,IMPCHK
; ERROR RETURN ... IMP OR INTERFACE DOWN
; ERROR RETURN ... IMP OR INTERFACE WAS DOWN
; OK RETURN
IMPCHK::
NOWAITS<
MOVEI T4,EMPTY ;ENABLE OUTPUT FLAG TEST
HRRM T4,MPPINT
>;NOWAITS
CONO IMP,MPPSET ;MAKE SURE OUTPUT ON
SKIPE INPON ;WANT INPUT OPEN?
PUSHJ P,IMPION ;YES, MAKE SURE TURNED ON
IFN FTF2,<
CONSO IMP,POWER ;POWER DOWN?
POPJ P, ;YES
>;IFN FTF2
CONSO IMP,SICK ;INTERFACE ERROR?
JRST CPOPJ2## ;NO, DOUBLE SKIP
IFN FTF2,<
CONSZ IMP,DEAD ;IS IT STILL DOWN?
>;IFN FTF2
POPJ P, ;YES
IFN FTF2,<
CONO IMP,CSICK ;CLEAR FAULT
JRST CPOPJ1 ;AND TAKE SINGLE SKIP
>;IFN FTF2
;INITIALIZE DEVICES ;⊗ IMPDWN IMPIOF IMPION BLKIPT INPON DUMMY BLKOPT OUTACT
;SUBROUTINE TO TURN THE HARDWARE OFF
IMPDWN::
IFE FTF2,<
CONO IMP,IFLUSH
>;IFE FTF2
IFN FTF2,<
CONO IMP,DOWN10+ALLENB;TURN OFF HARDWARE
>;IFN FTF2
NOWAITS<
HLLZS MPPINT ;DISABLE OUTPUT FLAG TEST IN SKIP CHAIN
>;NOWAITS
SETZM OUTACT
SETZM BLKIPT
SETZM BLKOPT
;HERE TO TURN OFF INPUT
IMPIOF::SETZM INPON ;TURN OFF INPUT ACTIVE FLAG
CONO IMP,MPIENB!MPEENB ;TURN OFF INPUT
NOWAITS<
HLLZS MPIINT ;DISABLE INPUT FLAG TESTS
HLLZS MPEINT
>;NOWAITS
POPJ P,
;HERE TO TURN INPUT ON
IMPION::SETOM INPON ;TURN ON FLAG FOR CLOCK
NOWAITS<
push p,t1 ; save a scratch
MOVEI t1,FULL ;ENABLE INTERRUPT FLAG TESTS
HRRM t1,MPIINT
MOVEI t1,ENDIN
HRRM t1,MPEINT
pop p,t1 ; restore scratch reg.
>;NOWAITS
CONO IMP,MPISET ;TURN ON INPUT
CONO IMP,MPESET
POPJ P,
$LIT
$LOW
;STORAGE
BLKIPT: 0 ;BLKI POINTER
INPON: 0 ;-1 IF INPUT SHOULD BE ACTIVE
DUMMY: 0 ;PLACE TO PUT DISCARDED INPUT DATA
BLKOPT: 0 ;BLKO POINTER
OUTACT: 0 ;-1 IF OUTPUT IS ACTIVE
END