Consolidate license copies
[its.git] / system / net.32
1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
2 ;;;
3 ;;; This program is free software; you can redistribute it and/or
4 ;;; modify it under the terms of the GNU General Public License as
5 ;;; published by the Free Software Foundation; either version 3 of the
6 ;;; License, or (at your option) any later version.
7 ;;;
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 ;;; General Public License for more details.
12 ;;;
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16
17 ;; For ITS network stuff, the following parameters are defined:
18 ;
19 ; NETP - General network code (net independent, both CHAOS, NCP, TCP, etc)
20 ; INETP - Internet Protocol code.  Must have IMPP or some other device.
21 ; NCPP - Include NCP code (IMPP must be on)
22 ; TCPP - Include TCP code (INETP must be on)
23
24 ; CHAOSP - Include CHAOS net code
25 ; - other CHAOS stuff, all independent of internet stuff.
26
27 NE%UNT==:<1_32.>        ; Escape bit indicating non-Internet address
28 NW$BYT==:301400         ; Byte pointer to network number (approx!)      
29 NE%STR==:<1_33.>        ; Escape bit indicating string-type address
30
31 DEFINE HOSTN A,B,C,D
32 .RADIX 10.,<<<<<A_8>+B>_8>+C>_8>+D,!TERMIN
33
34 ; HOSTS3 full word network # values for certain networks
35
36 NW%CHS==:<NE%UNT+<7_24.>>
37 NW%ARP==:<12_24.>
38 NW%LCS==:<22_24.>
39 NW%AI==:HOSTN 128,52,0,0
40
41 DEFINE GETNET AC,(ADDR)         ; Macro to extract net number
42 IFNB [ADDR] MOVE AC,ADDR
43         TLNN AC,(17_32.)        ; Check for non-Internet type addrs
44          TLNN AC,(1_31.)        ;  Internet address, see if class A net
45           TDZA AC,[77,,-1]      ;   Unternet or class A, zap low 3 octets
46         TLNN AC,(1_30.)         ; Class B or C, see which.
47          TRZA AC,177777         ;  Class B network, zap low 2 octets
48           TRZ AC,377            ;   Class C net, only zap 1 low octet
49 TERMIN
50
51 ;;; Misc defs
52 CALL==<PUSHJ P,>
53 RET==<POPJ P,>
54 CALRET==<JRST>
55 \f
56         OVHMTR NET
57
58 IFN IMPP,[      ; ARPAnet IMP interface code
59 IFN KAIMP,[
60 $INSRT IMPOLD
61 ]
62 IFN KSIMP,[
63 $INSRT IMP
64 ]
65 ]
66
67         OVHMTR NET
68
69 IFN NCPP,[      ; Old Arpanet NCP protocol code
70 $INSRT NCP
71 ]
72         OVHMTR NET
73
74 IFN INETP,[     ; Internet Protocol code
75 $INSRT INET
76 ]
77
78         OVHMTR NET
79
80 IFN TCPP,[      ; Transmission Control Protocol code
81 $INSRT TCP
82 ]
83
84         OVHMTR UUO
85
86 IFN CHAOSP,[    ; CHAOSnet interface and protocol code
87 $INSRT CHAOS
88 ]
89         OVHMTR UUO
90 \f
91 SUBTTL  General Network System Calls
92
93 ; .CALL NETRFC - Get a pending Request For Connection for a specific network
94 ;       Arg 1 - SIXBIT name of network
95 ;       Arg 2 - optional network-dependent arg
96 ;               (for CHAOS, points to packet buffer)
97 ;       Val 1 - network-dependent value
98 ;               For TCP and ARPNCP, this is <id>,,<port/socket #>
99 ; Control bits:
100         %NQREF==:1      ; Arg 2 is previously returned identifier,
101                         ; refuse connection and flush from queue.
102
103 NETRFC: MOVE C,CTLBTS(U)        ; Set up control bits in C
104 IFN TCPP,[
105         CAMN A,[SIXBIT /TCP/]
106          JRST TCPRQ
107 ]
108 IFN CHAOSP,[
109         CAMN A,[SIXBIT /CHAOS/]
110          JRST [ TRNE C,%NQREF   ; If refusing conn,
111                  JRST OPNL12    ; Ignore, can't handle yet.  "Mode not avail"
112                 CAIGE W,2       ; Must have a 2nd arg
113                  JRST OPNL30    ; "Too few args"
114                 MOVE A,B        ; Fake out old CHAOSQ call
115                 JRST CHAOSQ]
116 ]
117 IFN NCPP,[      ; NOP for now
118 ;       CAMN A,[SIXBIT /ARPNCP/]
119 ;        JRST IMPRQ
120 ]
121         JRST OPNL33             ; No match, say "meaningless args".
122 \f
123 ; .CALL NETBLK  - Wait for net channel state to change, or time out.
124 ;       Arg 1 - Channel (comes in R)
125 ;       Arg 2 - Undesired state
126 ;       Arg 3 - Optional timeout (as in .SLEEP), written back unless immediate
127 ;       Val 1 - New state
128 ;       Val 2 - Time left
129
130 NETBLK: HRRZ T,(R)              ; Get IOCHNM RH = device index
131         HLRZ I,(R)              ; Get LH = often connection index
132 IFN NCPP,[
133         CAIL T,NETDUI
134          CAILE T,NETDBO
135           CAIA
136            JRST [MOVE T,[HRRZ A,IMSOC4]
137                 JRST NETBLI]
138 ] ;NCPP
139 IFN CHAOSP,[
140         CAIE T,CHAIDN
141          CAIN T,CHAODN
142           JRST [MOVE T,[HRRZ A,CHSSTA]
143                 JRST NETBLI]
144 ] ;CHAOSP
145 IFN TCPP,[
146         CAIN T,TCPDUI
147          JRST [ MOVE T,[HLRZ A,XBSTAU]
148                 JRST NETBLI]
149         CAIN T,TCPDUO
150          JRST [ MOVE T,[HRRZ A,XBSTAU]
151                 JRST NETBLI]
152 ] ;TCP
153         JRST OPNL34     ; Not a net chan, say "Wrong Type Device".
154
155
156 ; T/ Instruction to XCT (not indexed) to get state in A
157 ; Entry at NETBLI adds (I) to the instruction.
158
159 NETBLI: ADDI T,(I)              ; Provide "index" for instruction.
160 NETBL0: CAIGE W,3
161          JRST [ HRLOI D,377777  ; No time given, use infinity
162                 JRST NETBL4 ]
163         TLNE C,1000             ; Skip if pointer rather than immediate
164          JRST [ HRRZ D,C        ; Get immediate time
165                 ADD D,TIME
166                 JRST NETBL4 ]
167         XCTR XRW,[MOVES D,(C)]  ; Get time, check writeability
168         JUMPGE D,[ MOVNS D      ; Relative time, make negative absolute
169                    SUB D,TIME
170                    JRST .+1 ]
171         UMOVEM D,(C)            ; Store back absolute time
172         MOVNS D                 ; Make positive
173 NETBL4: MOVEM D,AC0S+D(U)       ; Save absolute time to wait until
174         MOVEM B,AC0S+B(U)       ; Save undesired state
175         PUSHJ P,NETBL2          ; Skip if state change or timeout
176          PUSHJ P,UFLS
177         MOVE B,D
178         SUB B,TIME              ; How much used?
179         XCT T                   ; Return new state
180         JRST POPJ1
181
182 NETBL2: XCT T                   ; Get current state
183         CAME A,AC0S+B(U)        ; Skip if still match
184          JRST POPJ1
185         MOVE A,AC0S+D(U)        ; Timeout time
186         CAMG A,TIME
187          AOS (P)
188         POPJ P,
189 \f
190 SUBTTL Utilities - CVTH2A, CVTH3A
191
192
193 ; CVH2NA - Convert network host address in A to HOSTS2 format.
194 ;       A/ net address (any format)
195 ; Returns A
196
197 CVH2NA: PUSH P,B
198         LDB B,[301400,,A]       ; Get high 12 bits of net address
199         CAIGE B,70              ; If less than lowest HOSTS2-fmt value
200          JUMPN B,CVH2N3         ; then must be HOSTS3, go convert.
201         CAIL B,1000             ; If any of high 3 bits set,
202          JRST CVH2N3            ;  then it's a HOSTS3 strange-fmt number.
203         JUMPN B,CVH2N2
204         CAILE A,377             ; Zero network, so must be ARPA net
205          JRST CVH2N1            ; Not just 8 bits, just add net number.
206
207         ; Old-style 8-bit Arpanet host number
208         LSHC A,-6.
209         ROT B,6.
210         DPB B,[112000,,A]
211 CVH2N1: TLO A,(12_33)
212         JRST POPBJ
213
214         ; Probably HOSTS2 format number
215 CVH2N2: JRST POPBJ              ; For now, that's good enough.
216
217         ; HOSTS3 format number, convert it.
218 CVH2N3: CAIN B,12               ; Arpa net?
219          JRST [ LSHC A,-16.
220                 ANDI A,377
221                 ROT B,16.
222                 DPB B,[112000,,A]
223                 TLO A,(12_33)
224                 JRST POPBJ]
225         CAIN B,7+<NE%UNT_-24.>  ; Chaos net?
226          JRST [ ANDI A,177777   ; Yup, fix it up.
227                 TLO A,(7_33)
228                 JRST POPBJ]
229         CAIN B,22               ; LCS net?
230          JRST [ LSHC A,-8.
231                 ANDI A,-1
232                 LSH A,2
233                 LSHC A,8.
234                 TLO A,(22_33)
235                 JRST POPBJ]
236
237         ; Not a known net, but try to do something plausible.
238         ANDCM A,[-1_24.]        ; Preserve low 24 bits
239         DPB B,[331100,,A]       ; put net # into HOSTS2 field.
240         POP P,B
241         RET
242
243 ; CVH3NA - Convert network host address in A to HOSTS3 (Internet) format.
244 ;       A/ net address (any format)
245 ; Returns A
246
247 CVH3NA: PUSH P,B
248         LDB B,[301400,,A]       ; Get high 12 bits of net address
249         CAIGE B,70              ; If less than lowest HOSTS2 value,
250          JUMPN B,CVH3N3         ; it's already HOSTS3 format!  (unless zero)
251         CAIL B,1000             ; If any of high 3 bits were set,
252          JRST CVH3N3            ;  it must be a HOSTS3 strange-fmt addr.
253         JUMPN B,CVH3N2          ; If not zero, then must assume HOSTS2 fmt.
254
255         ; Old-format 8-bit Arpanet host number, or HOSTS2 with zero net.
256         CAILE A,377
257          JRST CVH3N6    ; If greater than 8 bits, assume HOSTS2, zero net.
258         LSHC A,-6       ; Put 10 bits spacing between host/imp #s.
259         LSH B,-<2+8.>
260         LSHC A,<2+8.+6>
261         TLO A,(12_24.)  ; and add ARPA network number.
262         JRST CVH3N3
263
264         ; HOSTS2 format number
265 CVH3N2: TRZE B,7        ; Zap low 3 bits to ensure correct comparison
266          JRST CVH3N5    ; If any were set, can't be Chaosnet.
267         CAIN B,7_3              ; Chaos net?
268          JRST [ ANDI A,177777           ; Yes, kill all but bottom 16 bits
269                 TLO A,(NE%UNT+<7_24.>)  ; Add Chaos net #
270                 JRST CVH3N3]
271 CVH3N5: CAIN B,12_3             ; Arpa net?
272 CVH3N6:  JRST [ LSHC A,-9.
273                 ANDI A,177777
274                 ROT B,9.
275                 DPB B,[201000,,A]
276                 TLO A,(12_24.)
277                 JRST CVH3N3]
278         CAIN B,22_3             ; LCS net?
279          JRST [ LSHC A,-8.
280                 LSH A,-2
281                 ANDI A,377
282                 LSHC A,-8.
283                 TLO A,(22_24.)
284                 JRST CVH3N3]
285
286         ; No match, assume it's HOSTS3.
287
288 CVH3N3: POP P,B
289         RET
290 \f
291 ;.CALL STYNET
292 ;ARG 1 - STY CHANNEL
293 ;ARG 2 - NET INPUT CHANNEL TO CONNECT STY OUTPUT TO, OR -1 TO DISCONNECT
294 ;ARG 3 - NET OUTPUT CHANNEL TO CONNECT STY INPUT TO
295 ;ARG 4 - CHARS TO SEND WHEN OUTPUT .RESET HAPPENS ON STY'S TTY
296 ;          UP TO 3 8-BIT CHARACTERS, LEFT JUSTIFIED.
297
298 NSTYNT: TLNN R,%CLSST
299          JRST OPNL34            ;1ST ARG NOT A STY CHANNEL.
300         HLRZ I,(R)              ;GET TTY # OF STY
301         HRRES B                 ;ALLOW IMMEDIATE -1
302         JUMPGE B,NSTYN2         ;JUMP IF CONNECTING.
303         PUSHJ P,NSTYN0          ;DISCONNECT
304          JRST OPNL41            ;WASN'T CONNECTED
305         JRST POPJ1
306
307 ;VARIOUS ROUTINES CALL HERE WITH THE TTY# OF A STY IN I, TO DISCONNECT THE
308 ; STY FROM THE NETWORK.  NOTE THIS ROUTINE MUST NOT CHANGE U AND MUST NOT
309 ; LSWCLR, SINCE IT COULD BE CALLED FROM IODCL VIA STYCLS OR NETCLS.
310
311 NSTYN0: MOVSI B,%SSNET          ;DISCONNECTING BOTH SIDES.
312         CONO PI,NETOFF
313         TDNN B,STYSTS-NFSTTY(I)
314          POPJ P,                        ;THIS STY NOT CONNECTED?
315         ANDCAB B,STYSTS-NFSTTY(I)       ;MARK AS NO LONGER CONNECTED
316         MOVE C,STYNTL-NFSTTY(I)         ;REMOVE THIS STY FROM ACTIVATION LIST
317         MOVEI D,STYNTA-STYNTL+NFSTTY
318 NSTYN1: CAMN I,STYNTL-NFSTTY(D)         ;FIND THE STY THAT POINTS TO THIS ONE,
319          MOVEM C,STYNTL-NFSTTY(D)       ;AND PATCH US OUT OF THE LIST.
320         SKIPE D,STYNTL-NFSTTY(D)        ;SEARCH WHOLE LIST TILL FIND WHO POINTS TO US.
321          JRST NSTYN1
322         SETOB C,STYNTL-NFSTTY(I)
323         EXCH C,STYNTI-NFSTTY(I) ;MARK THIS STY AS HAVING NO CONNECTION, GET SOCKET INDICES
324 IFN CHAOSP,[
325         TLNE B,%SSCHA
326          JRST [ MOVSI B,%SSCHA  ;DISCONNECT FROM CHAOS NET
327                 ANDCAM B,STYSTS-NFSTTY(I)
328                 MOVSI B,%CFSTY
329                 TDNN B,CHSSTA(C)
330                  JRST 4,.       ;CHAOS DOESN'T THINK IT WAS CONNECTED?
331                 ANDCAM B,CHSSTA(C)
332                 JRST NETOJ1 ]
333 ];CHAOSP
334 IFN TCPP,[
335         TLNE B,%SSTCP
336          JRST [ MOVSI B,%SSTCP          ; Disconnect from TCP connection
337                 ANDCAM B,STYSTS-NFSTTY(I)       ; Flush STY's "connect" bit
338                 MOVSI B,(XB%STY)
339                 TDNN B,XBUSER(C)        ; Make sure TCP thinks connected
340                  BUG                    ; It isn't??
341                 ANDCAM B,XBUSER(C)
342                 JRST NETOJ1]
343 ] ;TCPP
344 IFN NCPP,[
345         MOVE B,[40000,,777]
346         TDNN B,IMSOC5(C)
347          JRST 4,.               ;SOCKET DOESN'T THINK IT WAS CONNECTED?
348         ANDCAM B,IMSOC5(C)      ;AND MARK SOCKETS WE WERE CONNECTED TO AS DISCONNECTED
349         MOVSS C
350         TDNN B,IMSOC5(C)
351          JRST 4,.               ;SOCKET DOESN'T THINK IT WAS CONNECTED?
352         ANDCAM B,IMSOC5(C)
353         JRST NETOJ1
354 ] ;NCPP
355 .ELSE   BUG
356
357 ; Here to set up STY connection.
358
359 NSTYN2: MOVE Q,I                ;SAVE TTY # OF STY
360         MOVEI E,1
361         MOVE A,B                ;DECODE THE NETWORK INPUT CHANNEL
362         JSP T,CHNDCD
363         HRRZ A,(R)
364 IFN CHAOSP,[
365         CAIE A,CHAIDN
366          CAIN A,CHAODN
367           JRST [ HLRZ I,(R)     ;CONNECT TO CHAOS NET
368                  CONO PI,NETOFF
369                  MOVSI B,%CFSTY
370                  TDNE B,CHSSTA(I)
371                   JRST OPNL23   ;ALREADY CONNECTED, FILE LOCKED
372                  MOVSI C,%SSNET+%SSCHA
373                  TDNE C,STYSTS-NFSTTY(Q)
374                   JRST OPNL23   ;ALREADY CONNECTED, FILE LOCKED
375                  IORM B,CHSSTA(I)       ;OK, HOOK UP
376                  DPB Q,[$CFTTN,,CHSSTA(I)]
377                  JRST NSTYN3 ]
378 ];CHAOSP
379 IFN TCPP,[
380         CAIE A,TCPDUI
381          CAIN A,TCPDUO
382           JRST [HLRZ I,(R)      ; Connect to TCP, get TCB index
383                 CONO PI,NETOFF
384                 MOVSI B,(XB%STY)
385                 TDNE B,XBUSER(I)
386                  JRST OPNL23    ; TCB Already connected, say "File Locked"
387                 MOVSI C,%SSNET+%SSTCP
388                 TDNE C,STYSTS-NFSTTY(Q)
389                  JRST OPNL23    ; STY already connected, say "File Locked"
390                 DPB Q,[XB$STY (I)]      ; Store TTY # to connect TCB.
391                 JRST NSTYN3]
392 ] ;TCPP
393 IFN NCPP,[
394         JSP T,NETCHK    ;TEST LEGALITY;  OPNL IF LOSES
395         TDNE E,IMSOC2(I)
396          JRST OPNL2             ;WRONG DIRECTION IF IT'S AN OUTPUT CHANNEL
397         MOVE B,I                ;SAVE INPUT IMSOC INDEX
398         MOVE A,C                ;DECODE OUTPUT CHANNEL
399         JSP T,CHNDCD
400         JSP T,NETCHK
401         TDNN E,IMSOC2(I)
402          JRST OPNL2             ;WRONG DIRECTION IF INPUT SOCKET
403         CONO PI,NETOFF
404         MOVE E,[40000,,777]
405         TDNN E,IMSOC5(B)        ;ERROR IF EITHER CHANNEL ALREADY CONNECTED
406          TDNE E,IMSOC5(I)
407           JRST OPNL23           ;"FILE LOCKED"
408         MOVSI C,%SSNET
409         TDNE C,STYSTS-NFSTTY(Q)
410          JRST OPNL23            ;SIMILAR ERROR IF STY ALREADY CONNECTED
411         HRR E,Q                 ;GET 40000,,TTY #
412         IORM E,IMSOC5(I)
413         IORM E,IMSOC5(B)        ;MARK SOCKETS AS CONNECTED
414 ] ;NCPP
415
416 NSTYN3: SKIPGE STYNTL-NFSTTY(Q) ;HALT IF STY'S VARS ARE NOT CORRECT FOR A 
417          SKIPL STYNTI-NFSTTY(Q) ;NON-CONNECTED STY.
418           JRST 4,.
419         IORM C,STYSTS-NFSTTY(Q) ;ALL ERROR CAUGHT, SO MARK STY CONNECTED.
420         HRL B,I                 ;PUT INPUT IMSOC IDX,, OUTPUT IMSOC IDX
421         MOVSM B,STYNTI-NFSTTY(Q) ;INTO THE STY
422         TRZ D,7777              ;STORE THE OUTPUT RESET CHARACTERS - AT MOST 3
423         MOVEM D,STYORC-NFSTTY(Q)
424
425         ;ACTIVATE IN CASE HAS UNREAD INPUT
426 IFN NCPP,[
427         TLNN C,%SSCHA+%SSTCP
428          PUSHJ P,IMPUIN
429 ] ;NCPP
430 IFN CHAOSP,[
431         TLNE C,%SSCHA
432          PUSHJ P,CHINTI
433 ];CHAOSP
434 IFN TCPP,[
435         TLNE C,%SSTCP
436          PUSHJ P,TCPUII
437 ] ;TCPP
438         JRST NETOJ1
439 \f
440 SUBTTL  Clock interrupt level code
441
442 ; NETCLK - Slow net clock.  Called at clock level every 1/2 sec.
443 ;       Can clobber all ACs
444
445 NETCLK:
446 IFN CHAOSP, PUSHJ P,CHACLK      ; Run Chaos net 1/2-second clock
447 IFN TCPP, PUSHJ P,TCPCLK        ; Run TCP 1/2-sec clock
448         SETCMB A,NETCL1         ; Flip the 1 sec switch
449         JUMPE A,CPOPJ           ; Return unless time for 1-sec clock
450 IFN INETP,CALL IPFCLK           ; Run IP reassembly timeout every 1 sec
451         RET
452 EBLK
453 NETCL1: 0               ; Flip-flop to get 1-sec ticks
454 BBLK
455
456 ; STYNTC - Called at clock level every 1/60 sec to process all
457 ;       necessary transfers of data between STYs and associated
458 ;       net connections
459
460 STYNTC: CONO PI,NETOFF
461         SKIPN I,STYNTA          ;GET HEAD OF ACTIVATE LIST
462          JRST NETONJ            ;EMPTY
463         SETZM STYNTA            ;COPY LIST IN CASE A STY IS PUT BACK ON
464         CONO PI,NETON
465 STYNT7: MOVE A,STYNTL-NFSTTY(I) ;GET NEXT ON LIST
466         MOVEM A,STYNTB          ;SAVE FOR NEXT TIME AROUND LOOP
467         SETOM STYNTL-NFSTTY(I)  ;THIS ONE IS NO LONGER ON ACTIVATE LIST
468         MOVE A,STYSTS-NFSTTY(I)
469         TLNN A,%SSNET
470          JRST 4,.               ;STY CLAIMS NOT TO BE CONNECTED??
471         MOVE R,I                ;SAVE TTY #
472
473 IFN CHAOSP,[
474         TLNE A,%SSCHA
475          JRST STYCHA            ;CONNECTED TO CHAOS NET
476 ];CHAOSP
477 IFN TCPP,[
478         TLNE A,%SSTCP
479          JRST STYTCP
480 ] ;TCPP
481 IFN NCPP,[
482         JRST STYNCP
483 ];NCPP
484
485 STYNT8: SKIPE I,STYNTB          ;GET NEXT STY FROM COPIED ACTIVATION LIST
486          JRST STYNT7
487         POPJ P,
488
489 ;SUBROUTINE TO STANDARDIZE HOST NUMBER, OPNL25 IF NO GOOD
490 ;PROCESSES HOST NUMBER IN T, MUNGS H, CALLED BY JSP J,STDHST
491 STDHST:
492 IFN 1,[
493         EXCH A,T
494         CALL CVH3NA             ; Convert # to HOSTS3 fmt
495         EXCH A,T
496         LDB H,[301400,,T]       ; Get high 12 bits (net #)
497         CAIE H,12               ; Should be ARPA net
498          JRST OPNL25
499         TDZ T,[NW%ARP+<377_8.>] ; Flush the net # and logical host field
500         JRST (J)
501 ] ;IFN 1
502 IFN 0,[
503         LDB H,[331000,,T]       ;GET NETWORK-NUMBER FIELD
504         CAIE H,12               ;ONLY 12 OR 0 IS ACCEPTABLE
505          JUMPN H,OPNL25
506         TDNE T,[400600,,400]    ;MAKE SURE OTHER RANDOM BITS AREN'T ON
507          JRST OPNL25
508         TLZ T,777000            ;CLEAR NETWORK NUMBER
509         JUMPE T,OPNL25          ;0 IS NOT ACCEPTABLE
510         CAIL T,400              ;SKIP IF OLD-STYLE HOST NUMBER
511          JRST (J)
512         LDB H,[060200,,T]       ;GET HOST FIELD
513         ANDI T,77               ;GET IMP FIELD
514         EXCH H,T
515         DPB H,[112000,,T]       ;RECOMBINE
516         JRST (J)
517 ] ;IFN 0