ASMB,Q,C HED 3000 REPLY CONVERTER (C) HEWLETT-PACKARD CO. NAM RPCNV,19,25 91750-16170 REV.2013 800319 MEF SPC 1 ****************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY. * ****************************************************************** SPC 2 EXT EXEC,DTACH,$LIBR,$LIBX,$OPSY EXT #RPCV,#QXCL,#TST,#GET EXT D$TST,D$MAX,D$BSZ,D$MXR EXT .CAX,.MVW SPC 1 UNL NEXT 5 LINES ARE FOR PRODUCTION ENGINEERING * NAME: RPCNV *SOURCE: 91750-18170 * RELOC: 91750-16170 * PGMR: DMT LST **************************** RPCNV ******************************* * * * SOURCE: 91750-18170 * * * * BINARY: 91750-16170 * * * * PROGRAMMER: JIM HARTSELL * * * * FEBRUARY 28, 1977 * * * *----------------------------------------------------------------* * * * MODIFIED BY DMT BEGINNING NOVEMBER 7, 1978 * * FOR DS/1000 ENHANCEMENTS. * * MODIFIED BY JDH [790222] FOR DS REQUEST * * EQUATED OFFSETS. * * * ****************************************************************** SPC 1 * * RPCNV IS THE INTERFACE TO THE DS/1000 SLAVE MONITORS FOR REPLIES * DESTINED FOR THE HP 3000. ALL OUTGOING REPLIES ARE CONVERTED * TO DS/3000 FORMATS. * SUP A EQU 0 B EQU 1 SKP * GLBLK-START * ****************************************************************** * * * G L O B A L B L O C K REV 2013 791119 * * * * GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY: * * * * REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST * * GET, #SLAV, RQCNV, RPCNV, GRPM, DINIT, PTOPM * * EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3 * * DSTIO, LUMAP, #CMGT, INCNV, OTCNV, RMTIO * * RSM, DLGON, #DISM, #DSSM, #MSSM, #SCSM, #UPSM * ****************************************************************** * ***!!!!! THE ORDER OF THE FIRST 7 WORDS (#STR THRU #ENO) IS * ***!!!!! FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES * ***!!!!! AND ERROR CODES ALWAYS BE IN THE SAME PLACE, * ***!!!!! REGARDLESS OF MESSAGE FORMAT. THIS MAKES STORE-AND-* ***!!!!! FORWARD CODE MUCH SIMPLER. * #STR EQU 0 STREAM WORD. #SEQ EQU #STR+1 SEQUENCE NUMBER. #SRC EQU #SEQ+1 SOURCE NODE #. #DST EQU #SRC+1 DEST. NODE #. #EC1 EQU #DST+1 REPLY ECOD1. #EC2 EQU #EC1+1 REPLY ECOD2. #ENO EQU #EC2+1 NUMBER OF NODE REPORTING ERROR. * #ECQ EQU #ENO+1 ERROR CODE QUALIFIER (BITS 4 TO 7) #LVL EQU #ECQ MESSAGE FORMAT LEVEL (BITS 0 TO 3) #MAS EQU #LVL+1 MA "SEND" SEQ. # #MAR EQU #MAS+1 MA "RECV" SEQ. # #MAC EQU #MAR+1 MA "CANCEL" FLAGS #HCT EQU #MAC+1 HOP COUNT #SID EQU #HCT+1 SESSION ID WORD * #EHD EQU #SID LAST ITEM OF HEADER #MHD EQU #EHD+1 MINIMUM HEADER SIZE #REQ EQU #MHD START OF REQUEST SPECIFIC AREA #REP EQU #MHD START OF REPLY SPECIFIC AREA * #MXR EQU #MHD+24 <<< MAXIMUM DS REQ/REPLY BUFFER SIZE >>> #LSZ EQU 2 <<< SIZE OF LOCAL APPENDAGE AREA >>> * ****************************************************************** * * GLBLK-END SKP * RFBLK-START * ****************************************************************** * * * R F A B L O C K REV 2013 791119 * * * * OFFSETS INTO DS/1000 RFA MESSAGE BUFFERS, USED BY: * * * * RFMST, RFAM1, RFAM2, REMAT, RQCNV, RPCNV * * * ****************************************************************** * * OFFSETS INTO RFA REQUEST BUFFERS. * #FCN EQU #REQ RFA FUNCTION CODE. #DCB EQU #FCN+1 DCB/FILENAME AREA. #IRC EQU #DCB+3 DAPOS: IREC #IRB EQU #IRC+1 IRB #XIB EQU #IRC+2 IRB (DXAPO) #IOF EQU #IRB+1 IOFF #XIO EQU #XIB+2 IOFF (DXAPO) #ITR EQU #DCB+3 DCLOS: ITRUN #IC1 EQU #DCB+3 DCONT: ICON1 #IC2 EQU #IC1+1 ICON2 #ICR EQU #DCB+3 DCRET,DNAME,DOPEN,DPURG: ICR(1) #ID EQU #ICR+1 IDSEG #ISC EQU #ID+1 ISECU #SIZ EQU #ISC+1 DCRET: ISIZE(1) #SZ2 EQU #SIZ+1 ISIZE(2) #XRS EQU #SIZ+2 RECSZ (DXCRE) #TYP EQU #SZ2+1 ITYPE #XTY EQU #XRS+2 ITYPE (DXCRE) #NNM EQU #ISC+1 DNAME: NNAME #IOP EQU #ISC+1 DOPEN: IOPTN #NUR EQU #DCB+3 DPOSN: NUR #IR EQU #NUR+1 IR #XIR EQU #NUR+2 IR (DXPOS) #IL EQU #DCB+3 DREAD,DWRIT: IL #NUM EQU #IL+1 NUM #LEN EQU #FCN+1 DSTAT: ILEN #FOR EQU #LEN+1 IFORM #OPT EQU #FOR+1 IOP #NOD EQU #ICR+1 "FLUSH" REQUEST: NODE NUMBER * * OFFSETS INTO RFA REPLY BUFFERS. * #RFD EQU #REP DCRET,DOPEN: RFAMD ENTRY # #JSZ EQU #RFD+1 DCRET: JSIZE (DXCRE) #LOG EQU #REP DREAD: XLOG #REC EQU #REP DLOCF: IREC #RB EQU #REC+1 IRB #XRB EQU #REC+2 IRB (DXLOC) #OFF EQU #RB+1 IOFF #XOF EQU #XRB+2 IOFF (DXLOC) #JSC EQU #OFF+1 JSECT #XJS EQU #XOF+1 JSECT (DXLOC) #JLU EQU #JSC+1 JLU #XJL EQU #XJS+2 JLU (DXLOC) #JTY EQU #JLU+1 JTY #XJT EQU #XJL+1 JTY (DXLOC) #JRC EQU #JTY+1 JREC #XJR EQU #XJT+1 JREC (DXLOC) #IAD EQU #REP DSTAT: IADD * * MAXIMUM SIZE OF RFA REQUEST/REPLY BUFFER. * #RLW EQU #MHD+13 M A X I M U M S I Z E ! ! ! * * RFBLK-END SKP * DXBLK-START * ****************************************************************** * * * D E X E C B L O C K REV 2013 791119 * * * * OFFSETS INTO DS/1000 DEXEC MESSAGE BUFFERS, USED BY: * * * * DEXEC, EXECM, EXECW, RQCNV, RPCNV, FLOAD, REMAT * * DSTIO, LUMAP, #SCSM, RMTIO * ****************************************************************** * * OFFSETS INTO DEXEC REQUEST BUFFERS. * #ICD EQU #REQ ICODE FOR DEXEC(ALL) #CNW EQU #ICD+1 CONWD FOR DEXEC(1,2,3,13) #CWX EQU #CNW+1 DLUEX EXTENSION FOR DEXEC(1,2,3,13) #BFL EQU #CWX+1 IBUFL FOR DEXEC(1,2) #PM1 EQU #BFL+1 IPRM1 FOR DEXEC(1,2) #PM2 EQU #PM1+1 IPRM2 FOR DEXEC(1,2) #PRM EQU #CWX+1 IPRAM FOR DEXEC(3) #PGN EQU #ICD+1 PRGNM FOR DEXEC(6,9,10,12,23,24,99) #INU EQU #PGN+3 INUMB FOR DEXEC(6) #DPM EQU #INU+1 PARMS FOR DEXEC(6) (5-WORD AREA) #PMS EQU #PGN+3 PARMS FOR DEXEC(9,10,23,24) (5-WORD AREA) #IBF EQU #PMS+5 IBUFR FOR DEXEC(9,10,23,24) #IBL EQU #IBF+1 IBUFL FOR DEXEC(9,10,23,24) #FNO EQU #IBL+1 FNOD FOR DEXEC(9) (APLDR) #RSL EQU #PGN+3 IRESL FOR DEXEC(12) #MPL EQU #RSL+1 MTPLE FOR DEXEC(12) #HRS EQU #MPL+1 IHRS FOR DEXEC(12) #MIN EQU #HRS+1 IMIN FOR DEXEC(12) #SEC EQU #MIN+1 ISECS FOR DEXEC(12) #MSC EQU #SEC+1 MSECS FOR DEXEC(12) #PAR EQU #ICD+1 PARTI FOR DEXEC(25) (PARTITION #) #IST EQU #PGN+3 ISTAT FOR DEXEC(99) * * OFFSETS INTO DEXEC REPLY BUFFERS. * #EQ5 EQU #EC1 EQT 5 FOR DEXEC(1,2,3) #XML EQU #EC2 TRANSMISSION LOG (DEXEC 1,2) #RPM EQU #REP PRAMS FOR DEXEC(9,23) (5-WORD AREA) #TMS EQU #REP MSEC FOR DEXEC(11) #TSC EQU #TMS+1 SEC FOR DEXEC(11) #TMN EQU #TSC+1 MIN FOR DEXEC(11) #THR EQU #TMN+1 HRS FOR DEXEC(11) #TDA EQU #THR+1 DAY FOR DEXEC(11) #TYR EQU #TDA+1 YEAR FOR DEXEC(11) #ST1 EQU #REP ISTA1 FOR DEXEC(13) #ST2 EQU #ST1+1 ISTA2 FOR DEXEC(13) #ST3 EQU #ST2+1 ISTA3 FOR DEXEC(13) #PAG EQU #REP IPAGE FOR DEXEC(25) #IPN EQU #PAG+1 IPNUM FOR DEXEC(25) #PST EQU #IPN+1 ISTAT FOR DEXEC(25) #KST EQU #REP ISTAT FOR DEXEC(99) * * MAXIMUM SIZE OF DEXEC REQUEST/REPLY BUFFER. * #DLW EQU #MHD+11+#LSZ M A X I M U M S I Z E ! ! ! * * MAXIMUM SIZE OF DEXEC/EXECM DATA BUFFER. * #DBS EQU 512 M A X I M U M S I Z E ! ! ! * * DXBLK-END SKP * PPBLK-START * ****************************************************************** * * * P T O P B L O C K REV 2013 791119 * * * * OFFSETS INTO DS/1000 PTOP MESSAGE BUFFERS, USED BY: * * * * POPEN, PTOPM, GET/ACEPT/REJCT, RQCNV, RPCNV, DINIT, REMAT * * #SCSM * ****************************************************************** * * OFFSETS INTO PTOP REQUEST AND REPLY BUFFERS. * #FCD EQU #REP FUNCTION CODE. #PCB EQU #FCD+1 PCB AREA (3 WORDS). #TAG EQU #PCB+3 TAG AREA (20 WORDS). * * MAXIMUM SIZE OF PTOP REQUEST/REPLY BUFFER. * #PLW EQU #MXR M A X I M U M S I Z E ! ! ! * * PPBLK-END SPC 3 * OPBLK-START * ****************************************************************** * * * O P R E Q B L O C K REV 2013 791119 * * * * OFFSETS INTO DS/1000 OPREQ MESSAGE BUFFERS, USED BY: * * * * DMESS, OPERM, RQCNV, RPCNV * * RSM, DLGON, #MSSM, #UPSM * ****************************************************************** * * OFFSETS INTO OPREQ REQUEST AND REPLY BUFFERS. * #CML EQU #REQ COMMAND LENGTH. #CMS EQU #CML+1 COMMAND STRING. #LGC EQU #CMS+1 LOGON REQUEST CODE #LNL EQU #LGC+1 LENGTH OF USER NAME #LUN EQU #LNL+1 LOGON USER NAME * #RLN EQU #REP REPLY LENGTH. #MSG EQU #RLN+1 REPLY MESSAGE. * * MAXIMUM SIZE OF OPREQ REQUEST/REPLY BUFFER. * #OLW EQU #CMS+23 M A X I M U M S I Z E ! ! ! * * OPBLK-END SKP RPCNV LDA $OPSY RAR,SLA IS THIS AN RTE-III OR IV? RSSI RSS YES. JMP SETCL NO. LDB RSSI GET "RSS" INSTRUCTION. STB MODI2 MODIFY TO DO CROSS-MAP LOAD. STB MODI3 MODIFY TO DO CROSS-MAP STORE. DLD MWFI MODIFY TO DO "MWF" DST DMS3 CROSS-MAP MOVE. * JSB DTACH DETACH FROM POSSIBLE SESSION. DEF *+1 * SETCL LDA #RPCV SET BIT IOR B60K TO SAVE STA CLASS BUFFER. * ************************************************************ * * * MAIN PROCESSING SECTION FOR ALL REPLIES FOR THE 3000. * * * ************************************************************ * GET EQU * JSB EXEC LOOK AT THE CLASS. DEF *+7 DEF D21 DEF CLASS DEF T+CLS3 DEF D8 DEF PARM1 DEF PARM2 * LDA PARM1 CHECK FIRST OPTIONAL PARAMETER. CPA D8 8? JMP DOCLR INTERMEDIATE CONTINUATION. CPA D1 1? RSS SLAVE TIMEOUT FROM UPLIN. JMP DO#GT NEITHER--PICK UP VIA #GET. * DOCLR LDA CLASS CLEAR "SAVE BUFFER" ALR,RAR FLAG IN CLASS. STA TEMP JSB EXEC DO DUMMY "GET" DEF *+5 TO RELEASE DEF D21 BUFFER. DEF TEMP DEF T+AP25 DEF D0 * LDA PARM1 TAKE FURTHER ACTION CPA D8 DEPENDING UPON PARM1. JMP INTCO * * SLAVE TCB TIMED OUT AND UPLIN SENT THE SEQUENCE NUMBER. * LDA T+CLS3 GET SEQUENCE NUMBER. STA RQB+#SEQ PUT IT IN DS/1000 HEADER WORD. JMP SRTST GO SEARCH TST. * * INTERMEDIATE CONTINUATION REQUEST PASSED VIA RQCNV. * INTCO LDB PARM2 GET TST ADDRESS. STB TSTAD ADB D2 GET HOLDING CLASS JSB LODWD FROM S.A.M. STA T+HCLS ADB D9 GET ORIGINAL SEQUENCE JSB LODWD NUMBER FROM S.A.M. STA T+SEQ3 * LDA T+STR3 IF 3000 AND BIT14 REJECTED, SZA JMP RLTST RELEASE TST. * JMP PSTUP DO PRELIMINARY SET-UP. SPC 1 * BUFFER CAME FROM DS/1000 MONITOR. DO#GT JSB #GET PICK UP BUFFER DEF *+6 FROM DS/1000 SLAVE MONITORS. DEF #RPCV RPCNV'S I/O CLASS. DEF RQB 1000 REPLY BUFFER. DEF C#MXR MAXIMUM LENGTH. DBUFA DEF T+AP25 DEF D$MAX JMP GET ERROR RETURN. * STA RQLOG SAVE REPLY LENGTH. STB TCNT SAVE LENGTH OF DATA RECEIVED. * * SEARCH TRANSACTION STATUS TABLE (TST) FOR MATCHING SEQUENCE # * IN 8-WORD FIXED-FORMAT HEADER. * SRTST DLD #TST GET TST ADDR AND # OF ENTRIES. STA TEMP CMB,INB STB TEMP1 SZA SZB,RSS JMP GET FORGET IT IF NO TST. * TSTLP LDB TEMP CHECK NEXT ENTRY. JSB LODWD VALID ENTRY? SZA,RSS JMP NXTST NO. GO CHECK NEXT ENTRY. INB YES. JSB LODWD (CROSS) LOAD LOCAL SEQ. #. CPA RQB+#SEQ JMP CONV MATCH. GO PROCESS REPLY. * NXTST LDB TEMP BUMP TO NEXT ENTRY. ADB TSTLN STB TEMP ISZ TEMP1 JMP TSTLP JMP GET NOT FOUND. * * MOVE TST ENTRY FROM S.A.M. TO LOCAL STORAGE AREA. * (THIS IS 8-WORD HEADER BELONGING TO THIS REPLY.) * CONV LDA TEMP SAVE ADDR OF TST ENTRY IN S.A.M. STA TSTAD LDA TSTLN MOVE TST ENTRY TO LOCAL STORAGE. JSB .CAX LDA TSTAD LDB LTSTA DMS3 JSB .MVW MOVE: [DMS: "MWF"]. DEF TSTLN NOP * * PERFORM PRELIMINARY SET-UP OF FIXED FORMAT HEADER. * PSTUP LDA T+STR3 AND NOT13 CLEAR CONTINUATION BIT. IOR BIT15 SET REPLY BIT. STA T+STR3 LDA RQB+#SID REVERSE PROCESS NUMBERS. ALF,ALF * LDB PARM1 DS/3000 CONTINUATION REQUEST? CPB D8 JMP CONRQ YES. GET DATA OFF BUFFER. CPB D1 IF UPLIN DETECTED A TIMEOUT JMP TOREJ REJECT IT. * STA T+PRC3 STORE REVERSED PROCESS NUMBERS. * * IF OPERATOR COMMAND REPLY, PROCESS INTERVENING $STDLIST MESSAGE. * LDA RQB+#STR AND B17 CPA D7 RSS JMP CONV1 NOT A COMMAND REPLY. * DLD RQB+#EC1 GET ERROR CODE. SZA,RSS IF ZERO, JMP CKRPL CHECK FOR ASCII REPLY * DST T+APN2 STORE ASCII ERROR CODE. LDA D2 LENGTH IS 2 WORDS. JMP DO$SD DO $STDLIST. * CKRPL LDA T+CLS3 IF ORIGINAL 3000 CLASS AND B377 WAS 6 (HELLO/BYE/KILL), CPA D6 THERE IS NO MESSAGE. JMP CONV1 * LDA RQB+#RLN IF NO ASCII SZA,RSS REPLY MESSAGE, JMP CONV1 DON'T DO THE $STDLIST. * LDA D#PCB MOVE ASCII REPLY MESSAGE. LDB ARQ10 JSB .MVW DEF RQB+#RLN NOP * LDA RQB+#RLN GET LENGTH OF ASCII REPLY MSG. * DO$SD ADA D2 ADD # CONTROL WORDS. ALS STA T+BYT3 STORE BYTE COUNT. ARS ADA D8 STA RQLEN SAVE LENGTH OF REQUEST. * LDA T+PRC3 SAVE 3000 PROCESS NUMBERS. STA SVFTO AND B377 SET "FROM PROCESS NO." STA T+PRC3 ZERO. (NO 3000 REPLY) LDA T+CLS3 SAVE 3000 MESSAGE CLASS. STA SVMCL LDA T+STR3 SAVE 3000 STREAM TYPE. STA SVSTR (REPLY BIT IS SET) LDA D5 BUILD $STDLIST REQUEST. STA T+CLS3 MESSAGE CLASS = 5. LDA B20 STA T+STR3 STREAM = 20. CLA CLEAR CONTROL WORDS. STA T+APNG STA T+APN1 LDA RQLEN GET LENGTH OF REQUEST. ALF,ALF STA B LDA T+CLS3 STORE WORD COUNT. AND B377 IOR B STA T+CLS3 * JSB SEND WRITE $STDLIST TO QUEX. JMP RLTST ERROR RTN: LINE DISCONNECTED. * LDA SVMCL RESTORE 3000 MESSAGE CLASS. STA T+CLS3 LDA SVSTR RESTORE 3000 STREAM. STA T+STR3 LDA SVFTO RESTORE 3000 PROCESS NUMBERS. STA T+PRC3 * * CONVERT DS/1000 REPLY TO DS/3000 FORMAT. * CONV1 CLA CLEAR "DATA IN STA INPLC PLACE" FLAG. JSB D1000 MAKE CONVERSION. * STA T+BYT3 STORE BYTE LENGTH. INA STORE WORD COUNT BYTE. ARS ADA D8 STA RQLEN SAVE LEN OF DS/3000 REPLY. ALF,ALF STA B LDA T+CLS3 AND B377 IOR B STA T+CLS3 * * CHECK IF THERE IS DATA IN THIS REPLY. * LDA TCNT IS THERE DATA? SZA JMP CONT1 YES. GO PREPARE DATA REPLY. * * CLASS WRITE THE DS/3000 REPLY TO QUEX'S I-O CLASS. * PUT JSB SEND DO CLASS WRITE/READ. NOP IGNORE ERROR RETURN. * * RELEASE TST ENTRY IN S.A.M. * RLTST LDA T+HCLS LEAVING A HOLDING CLASS? SZA,RSS JMP STO0 NO. SET 1ST WORD TO 0. * JSB EXEC GET BUFFER OFF DEF *+5 HOLDING CLASS DEF CLS21 AND DEALLOCATE. DEF T+HCLS DEF TEMP DEF D0 NOP (IGNORE ERRORS.) * STO0 LDB TSTAD CLA SZB (MAKE SURE ADDR IS GOOD!) JSB STRWD * JMP GET DONE WITH THIS REPLY. SPC 5 ************************************************************ * * * INTERMEDIATE CONTINUATION REQUEST RECEIVED FOR DS/3000 * * DREAD/PREAD/DEXEC(1) DATA REPLIES. * * * ************************************************************ * CONRQ LDA T+PRC3 REVERSE PROCESS NUMBER. ALF,ALF STA T+PRC3 JSB EXEC READ DATA. DEF *+6 DEF CLS21 DEF T+HCLS (DE-ALLOCATE) DEF T+APNG DEF D$MAX DEF TCNT # WORDS REMAINING. JMP REJCT ERROR. * ISZ INPLC DATA IS IN PLACE. CLA RESET BYTE STA T+BYT3 COUNT AND CLEAR STA T+HCLS CLASS NUMBER IN LDB TSTAD LOCAL AND ADB D2 SAM TST. JSB STRWD LDA T+CLS3 RESET AND B377 WORD IOR UP8 COUNT. STA T+CLS3 SPC 1 ************************************************************ * * * SECONDARY SECTION FOR DREAD/PREAD/DEXEC(1) DATA REPLIES. * * * ************************************************************ * * PROCESS DATA REPLIES (POSSIBLE CONTINUATIONS). * * USE MINIMUM OF D$BSZ (CONFIGURED LINE SIZE, SET BY QUEX) AND * D$MXR (ACTUAL BUFFER SIZE APPENDED) FOR SENDING DATA. * CONT1 LDA D$BSZ SUBTRACT D$BSZ CMA,INA FROM D$MXR. IF ADA D$MXR RESULT > 0 USE D$BSZ. LDB D$BSZ IF < 0, USE D$MXR. SSA LDB D$MXR STB BUFSZ SAVE BUFFER SIZE LOCALLY. * LDA T+CLS3 STORE HEADER + ALF,ALF APPENDAGE LENGTH. AND B377 STA H&ALN ADA TCNT ADD TOTAL # DATA WORDS REMAINING. STA RQLEN SAVE TOTAL REQUEST LENGTH. CMA,INA ADA BUFSZ WILL IT ALL FIT IN THIS REPLY? SSA,RSS JMP CONT3 YES. * LDA BUFSZ NO. SET LENGTH TO MAX. STA RQLEN LDA T+STR3 SET CONTINUATION BIT. IOR BIT13 STA T+STR3 LDA T+LSEQ SET RTE SEQUENCE # SO CONT. STA T+SEQ3 REQUEST WILL GO TO RPCNV. * CONT3 LDA H&ALN SUBTRACT HEADER + CMA,INA APPENDAGE LEN FROM ADA RQLEN TOTAL REQUEST LENGTH STA DALEN FOR DATA LENGTH. * LDA INPLC IF "DATA IN PLACE" SZA FLAG IS SET, JMP CONT4 DON'T NEED TO MOVE DATA. * LDB ARQ0 FIND WHERE TO PUT THE DATA ADB H&ALN IN THE DS/3000 REPLY. LDA DBUFA JSB .MVW MOVE THE NEXT DATA BLOCK. DEF DALEN NOP * CONT4 LDA DALEN UPDATE REPLY BYTE COUNT. ALS ADA T+BYT3 STA T+BYT3 * JSB SEND WRITE REPLY TO QUEX. JMP RLTST ERROR RTN: LINE DISCONNECTED. * LDA DALEN REDUCE TCNT BY DALEN. CMA,INA ADA TCNT STA TCNT SZA,RSS ANY MORE DATA BLOCKS? JMP RLTST NO. GO RELEASE TST ENTRY. * * ALLOCATE A HOLDING CLASS AND WRITE DATA. * LDA BIT15 INITIALIZE CLASS # FOR STA T+HCLS NO WAIT. * LDA DBUFA CALCULATE ADDRESS ADA DALEN OF REMAINING DATA. STA DTADR * JSB EXEC WRITE DATA BLOCK TO HOLDING CLASS. DEF *+8 DEF CLS20 DEF D0 DTADR DEF *-* ADDRESS OF REMAINING DATA. DEF TCNT LENGTH OF THIS BLOCK. DEF TCNT DEF D0 DEF T+HCLS JMP REJCT ERROR. * LDB TSTAD SET HOLDING CLASS ADB D2 NUMBER IN TST. LDA T+HCLS JSB STRWD * JMP GET GET NEXT REPLY. SPC 1 BUFSZ NOP BUFFER SIZE. SKP * * BEFORE REJECTING, REVERSE PROCESS NUMBERS FOR SLAVE TCB TIMEOUT. * TOREJ LDA T+PRC3 ALF,ALF STA T+PRC3 * * SEND A "REJECT" REPLY TO THE 3000 FOR THIS REQUEST. * LOCAL TST STORAGE AREA CONTAINS CURRENT TST 4-WORD HEADER * AND FIXED-FORMAT HEADER FROM CURRENT REQUEST. "TSTAD" * CONTAINS ADDRESS OF TST ENTRY IN S.A.M. * REJCT LDA T+STR3 SET REJECT BIT IN REQUEST. IOR BIT14 AND NOT13 CLEAR CONTINUATION BIT. STA T+STR3 CLA SET APPENDAGE/DATA STA T+BYT3 LENGTH 0. LDA D8 REQUEST LENGTH IS 8. STA RQLEN LDA T+CLS3 SET LENGTH OF HEADER AND B377 PLUS APPENDAGE TO 8. IOR UP8 STA T+CLS3 JMP PUT GO SEND REJECT REPLY & RELEASE TST. SPC 5 * * SUBROUTINE TO SAVE RESOURCES AND TERMINATE UNTIL * RE-SCHEDULED BY QUEX WHEN INTERMEDIATE REPLY ARRIVES. * * * SUBROUTINE TO LOAD FROM ALTERNATE MAP (IF RTE-III OR IV). * LODWD NOP MODI2 LDA B,I (RSS IF DMS SYSTEM) JMP LODWD,I RETURN IF RTE-II. XLA B,I LOAD WORD FROM ALTERNATE MAP. JMP LODWD,I * MWFI MWF NOP SPC 3 * * SUBROUTINE TO STORE INTO ALTERNATE MAP (IF RTE-III OR IV). * STRWD NOP JSB $LIBR NOP MODI3 STA B,I (RSS IF DMS SYSTEM) JMP OUT XSA B,I STORE WORD INTO ALTERNATE MAP. OUT JSB $LIBX DEF STRWD RETURN TO CALLER. SKP * * SUBROUTINE TO WRITE TO QUEX'S I/O CLASS. * SEND NOP * LDA #QXCL IF DISCONNECTED, SSA TAKE ERROR RETURN. JMP SEND,I * JSB EXEC DO CLASS WRITE/READ. DEF *+8 DEF CLS20 NO ABORT. DEF D0 DEF T+CLS3 REPLY ADDRESS. DEF RQLEN REPLY LENGTH. DEF RQLEN DEF D0 DEF #QXCL I/O CLASS OF QUEX. JMP RLTST ERROR RETURN. * ISZ SEND TAKE NORMAL RETURN. JMP SEND,I RETURN TO CALLER. SKP Pl * ************************************************************** * * * SUBROUTINE TO CONVERT DS/1000 REPLIES TO DS/3000 FORMAT. * * * ************************************************************** * D1000 NOP LDA RQB+#STR ISOLATE STREAM TYPE. AND B377 ADA N4 SUBRACT 4. LDB D3 JSB BNDCK CHECK RANGE: 0 - 3. ADA JTAB1 TABLE ADDRESS + STREAM TYPE. LDA A,I JMP A,I GO TO MESSAGE CLASS PROCESSORS. * JTAB1 DEF *+1 DEF MSCL4 PTOP. DEF MSC8B DEXEC. DEF MSC8A RFA. DEF MSCL3 OPERATOR COMMAND. * ************************************************ * SUBROUTINE TO CHECK FOR ASCII ERRORS. * * LOAD B-REG WITH SYSTEM ERROR CODE (-41 FOR * * PTOP, -999 FOR RFA) AND CALL CHKER. NO CHANGE* * TAKES PLACE IF ERROR IS NUMERIC. * ************************************************ * CHKER NOP ENTRY. LDA RQB+#ENO GET ERROR INDICATOR. SSA,RSS IF ASCII BIT NOT SET, JMP CHKER,I RETURN. LDA RQB+#EC1 GET CHARACTER PART. CPA "DS" IF IT'S A DS ERROR, RSS CONVERT TO NUMBER. JMP RTNER OTHERWISE RETURN. LDA RQB+#EC2 GET NUMERIC PART AND B17 OF ERROR CODE. CMA,INA NEGATE. ADA N50 ADD -50. STA B RTNER STB RQB+#EC2 STORE NUMERIC IN BUFFER. JMP CHKER,I RETURN. * ************************************************ * MESSAGE CLASS 3 ..... OPERATOR COMMANDS. * ************************************************ * MSCL3 CLA SET (A) = BYTE COUNT. JMP D1000,I RETURN. * ************************************************ * MESSAGE CLASS 4 ..... PREAD/PWRIT/PCONT.* ************************************************ * MESSAGE CLASS 7, STREAM 21 ..... POPEN/PCLOS.* ************************************************ * MSCL4 LDA RQB+#FCD PCLOS REPLY? AND B17 CPA D5 JMP SBC YES. * LDB N44 IF SYSTEM ERROR OCCURRED, JSB CHKER CHANGE TO NUMERIC CODE. * LDA RQB+#EC2 MAP DS/1000 ERROR CODES TO DS/3000. LDB BIT15 SET DEFAULT TO "CCE". CPA N41 LDB CL209 MAP -41 TO CCL & 209. CPA N42 LDB CL205 MAP -42 TO CCL & 205. CPA N44 LDB CL213 MAP -44 TO CCL & 213. CPA N45 LDB CL216 MAP -45 TO CCL & 216. STB T+APNG STORE IN DS/3000 REPLY. * LDA SB21 INIT. STREAM TO 100021B. STA T+STR3 * LDB T+MASK IF POPEN REPLY, LDA T+FNCD CPA D1 STB T+AP25 MOVE MASK WORD TO DS/3000 REPLY. * LDA B26 SET ACCEPT/REJECT STREAM TYPE. LDB RQB+#FCD SSB LDA B27 IOR BIT15 SET REPLY BIT. STA T+STR3 ELA,CLE,ERA LDB D211 IF REJECT, CPA B27 STB T+APNG STORE CCG & 211. * CLA CLEAR UNUSED WORD. STA T+APN1 * LDA D#PCB MOVE PCB & TAG. LDB ARQ10 JSB .MVW DEF D23 NOP * ISZ INPLC SET "DATA IN PLACE" FLAG. * SBC LDA T+FNCD SET REPLY BYTE COUNT. AND B17 ADA N1 ADA JTAB2 LDA A,I RETURN (A) = BYTE CNT W/O DATA. JMP D1000,I * JTAB2 DEF *+1 DEC 52 POPEN. DEC 50 PREAD. DEC 50 PWRIT. DEC 50 PCONT. DEC 0 PCLOS. * ************************************************ * MESSAGE CLASS 8, STREAM 20 ..... RFA. * ************************************************ * MSC8A LDB N999 IF SYSTEM ERROR OCCURRED, JSB CHKER CHANGE TO NUMERIC. * LDB RQB+#EC2 MOVE IERR TO "A-REG", IERR. STB T+APNG STB T+APN2 * CLA SSB IF ERROR, SKIP RFAMD #. JMP MSCA1 LDB T+FNCD IF DCRET OR DOPEN, MOVE CPB D3 RFAMD ENTRY # TO "B-REG" SLOT. LDA RQB+#RFD CPB D6 LDA RQB+#RFD MSCA1 STA T+APN1 * CPB D9 CHECK FOR ADDITIONAL PROCESSING. JMP DREAD CPB D4 JMP DLOCF CPB D10 JMP DSTAT * LDA D6 NONE OF THE ABOVE. JMP D1000,I RETURN WITH (A) = BYTE COUNT. * DREAD LDA RQB+#LOG MOVE LEN PARAM. LDB RQB+#EC2 SSB CLA STA T+APN3 LDA D8 JMP D1000,I RETURN WITH (A) = BYTE COUNT. * DLOCF LDA D#REP MOVE DLOCF PARAMS. LDB ARQ11 JSB .MVW DEF D7 NOP LDA D20 JMP D1000,I RETURN WITH (A) = BYTE COUNT. * DSTAT CLA STA T+APNG STA T+APN1 LDA D4 JMP D1000,I RETURN WITH (A) = BYTE COUNT. * ************************************************ * MESSAGE CLASS 8, STREAM 21 ..... DEXEC. * ************************************************ * MSC8B DLD RQB+#EC1 MOVE A&B-REG RETURN VALUES. DST T+APNG * CLA MOVE ADDITIONAL VALUES. LDB T+FNCD CPB D11 LDA D5 CPB D13 LDA D3 STA TEMP # ADDITIONAL WORDS. * SZA,RSS JMP FRBC NONE TO MOVE. * LDA D#REP LDB ARQ10 JSB .MVW DEF TEMP NOP * FRBC LDA TEMP FIND RESULTING BYTE COUNT. ADA D2 ALS JMP D1000,I RETURN WITH (A) = BYTE COUNT. SKP * * SUBROUTINE TO CHECK IF INDEX IS WITHIN SPECIFIED RANGE. * (A) = INDEX (PRESERVED) (B) = UPPER LIMIT. * REQUEST IS REJECTED OF OUT OF BOUNDS. * BNDCK NOP STA LOC SAVE A-REGISTER. SSA JMP REJCT REJECT IF NEGATIVE. CMA,INA ADA B SSA JMP REJCT REJECT IF BEYOND LIMIT. LDA LOC RESTORE A-REGISTER. JMP BNDCK,I RETURN. * LOC OCT 0 SPC 3 * * SUBROUTINE TO CHECK IF DATA LENGTH EXCEEDS DS/1000 LIMIT. * LIMCK NOP (A) = TCOUNT: -BYTES OR +WORDS. SSA,RSS JMP LIM1 + WORDS. CMA,INA - BYTES. CONVERT TO +WORDS. INA ARS LIM1 CMA,INA ADA D$MAX SSA JMP REJCT EXCEEDS LIMIT. REJECT. JMP LIMCK,I SKP * * CONSTANTS AND WORKING STORAGE. * D0 DEC 0 D1 DEC 1 D2 DEC 2 D3 DEC 3 D4 DEC 4 D5 DEC 5 D6 DEC 6 D7 DEC 7 D8 DEC 8 D9 DEC 9 D10 DEC 10 D11 DEC 11 D13 DEC 13 D20 DEC 20 D21 DEC 21 D23 DEC 23 D211 DEC 211 B17 OCT 17 B20 OCT 20 B26 OCT 26 B27 EQU D23 B377 OCT 377 B60K OCT 60000 UP8 BYT 10,0 DECIMAL 8, LEFT BYTE. BIT13 OCT 20000 BIT14 OCT 40000 BIT15 OCT 100000 NOT13 OCT 157777 SB21 OCT 100021 CLS20 DEF 20,I CLS21 DEF 21,I CL205 OCT 040315 CL209 OCT 040321 CL213 OCT 040325 CL216 OCT 040330 N1 DEC -1 N4 DEC -4 N41 DEC -41 N42 DEC -42 N44 DEC -44 N45 DEC -45 N50 DEC -50 N999 DEC -999 "DS" ASC 1,DS CLASS NOP PARM1 NOP PARM2 NOP INPLC NOP SVMCL NOP SVSTR NOP SVFTO NOP TEMP NOP TEMP1 NOP RQLOG NOP RQLEN NOP H&ALN NOP DALEN NOP TCNT NOP * C#MXR ABS #MXR MAX LENGTH OF DS/1000 REQUEST. RQB BSS #MXR+#LSZ DS/1000 REQUEST BUFFER. D#REP DEF RQB+#REP D#PCB DEF RQB+#PCB * TSTAD NOP ADDR OF TST ENTRY IN S.A.M. TSTLN DEC 14 LENGTH OF TST ENTRY. LTSTA DEF T+STR1 ADDR OF LOCAL TST AREA. * * OFFSETS INTO LOCAL TST AND DS/3000 REQUEST BUFFER: T EQU D$TST STR1 EQU 0 DS/1000 STREAM LSEQ EQU 1 LOCAL SEQUENCE NO HCLS EQU 2 HOLDING CLASS NO MCLS EQU 3 MONITOR CLASS NO FNCD EQU 4 MONITOR CLASS NO MASK EQU 5 POPEN MASK WORD CLS3 EQU 6 DS/3000 CLASS STR3 EQU 8 DS/3000 STREAM PRC3 EQU 10 PROCESS NUMBERS SEQ3 EQU 11 SEQUENCE NUMBER BYT3 EQU 13 BYTE COUNT APNG EQU 14 APPENDAGE APN1 EQU 15 APPENDAGE WORD 1 APN2 EQU 16 APPENDAGE WORD 2 APN3 EQU 17 APPENDAGE WORD 3 AP25 EQU 39 APPENDAGE WORD 25 (FWA DATA) SPC 3 ARQ0 DEF T+CLS3 FIRST WORD OF DS/3000 HEADER ARQ10 DEF T+APN2 SECOND WORD OF DS/3000 APPENDAGE ARQ11 DEF T+APN3 THIRD WORD OF DS/3000 APPENDAGE * BSS 0 ******** SIZE OF RPCNV ************ * END RPCNV