ASMB,R,Q,C HED OTCNV 91750-16144 REV 2013 * (C) HEWLETT-PACKARD CO. 1980 NAM OTCNV,19,20 91750-16144 REV.2013 791219 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 HEWLETT-PACKARD COMPANY. * ****************************************************************** SPC 2 ENT OTCNV * EXT EXEC,DTACH,#GETR,#GRPM,#CVBF,#OTCV,.MVW EXT #BREJ,#NRVS,$CVT1,CNUMD,REIO,$TIME,#QCLM EXT XLUEX,#INCV,#OCV0 * SUP * ************************ * NAME: OTCNV * * * SOURCE: 91750-18144 * THIS VERSION RUNS IN * * RELOC: 91750-16144 * MESSAGE FORMAT * * PGMR: JIM HARTSELL * LEVEL 1 NODES * * * * * ************************ * * * OTCNV IS AN OUTGOING-MESSAGE CONVERTER THAT CONVERTS MESSAGES FROM * THE LOCAL UPGRADE LEVEL "DOWN" TO THE FORMAT REQUIRED BY THE DESTINA- * TION NODE. THE LOCAL UPGRADE LEVEL IS INDICATED BY #LEVL (IN RES). * THE DESTINATION UPGRADE LEVEL IS FOUND BY SEARCHING THE NRV. * A GIVEN VERSION, OR "LEVEL" OF OTCNV WILL NOT KNOW ABOUT HIGHER LEVEL * FORMATS. THESE WILL BE CONVERTED AT THE DESTINATION NODE BY INCNV. * ALL VERSIONS OF OTCNV CAN CONVERT DOWN TO LEVEL 0. * * FOR EXAMPLE: THE GENERAL DS SOFTWARE AT A NODE WHICH OPERATES AT * UPGRADE LEVEL 1 ONLY KNOWS HOW TO BUILD MESSAGES FOR LEVEL 1 FORMAT. * IT DOESN'T KNOW ABOUT OTHER LEVEL FORMATS. BEFORE SENDING THE REQUEST, * #MAST AND #SLAV CHECK THE DESTINATION NODE UPGRADE LEVEL IN THE NRV. * IF THE DESTINATION LEVEL IS LOWER THAN THE LOCAL NODE LEVEL, THE * REQUEST IS SENT TO OTCNV TO BE CONVERTED "DOWN" BEFORE BEING SENT. * * TO EXTEND OTCNV FOR THE NEXT UPGRADE LEVEL, * * 1. SET MAX, HDR EQUATES FOR NEW LEVEL. * 2. REPLACE GLOBAL EQUATE BLOCK WITH NEW FORMAT DEFINITIONS. * 3. ADD ENTRY TO FMTBL & TOTBL. * 4. ADD FROMX AND TOX TABLE. * 5. ADD ENTRY TO SPECL (ADD "EXT" IF ROUTINE REQUIRED). * * MAX EQU 37 MAX REQ SIZE FOR ALL LEVELS. HDR EQU 13 MAXIMUM HEADER SIZE, ALL LEVELS. SKP * * THE FOLLOWING GLOBAL EQUATE BLOCK MUST DEFINE MESSAGE HEADER FORMAT * FOR LEVEL OF NODE IN WHICH THIS VERSION OF OTCNV IS RUNNING. * * * GLBLK-START * ****************************************************************** * * * G L O B A L B L O C K REV XXXX 790531 * * * * GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY: * * * * REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST * * GET, #SLAV, RQCNV, RPCNV, GRPM, LSTEN, PTOPM * * EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3 * * * ****************************************************************** * ***!!!!! THE FIRST 7 WORDS (#STR THRU #ENO) MUST BE FIXED !!!!!*** #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 BASE EQU * FWA OTCNV FOR GETTING REL ADDR. SPC 3 * ******************************************* * * * * * C O N V E R S I O N T A B L E S * * * * * ******************************************* SPC 2 * * WHEN CONVERTING FROM A NEWER FORMAT TO THE NEXT LOWER LEVEL, THE * FORMAT LEVEL NUMBER OF THE OLDER FORMAT IS USED AS THE OFFSET INTO * BOTH THE "FROM TABLE" (FMTBL) AND THE "TO TABLE" (TOTBL). IN OTHER * WORDS, WHEN THE OLDER FORMAT IS LEVEL 0, THEN OFFSET 0 IN BOTH TABLES * SPECIFIES CONVERSION FROM FORMAT LEVEL 1 (FROM1) TO FORMAT LEVEL 0 (TO0). * SPC 3 FMTBL DEF *+1 DEF FROM1 FROM LEVEL 1. DEF FROM2 FROM LEVEL 2. * . * . * . SPC 5 TOTBL DEF *+1 DEF TO0 TO LEVEL 0. DEF TO1 TO LEVEL 1. * . * . * . SPC 3 * * TABLE OF ENTRY POINTS FOR OPTIONAL EXTERNAL REQUEST-SPECIFIC * CONVERSION ROUTINES. USE SUBROUTINE NAMES OF THE FORM #OCV0, #OCV1,... * IF APPLICABLE FOR THAT LEVEL. IF NO REQUEST-SPECIFIC CONVERSION * IS NEEDED, JUST USE THE DUMMY "NULL". * SPECL DEF *+1 DEF #OCV0 LEVEL 1 TO LEVEL 0 SPECIFICS (EXT). * . * . * . * * TABLES CONTINUED NEXT PAGE.... SPC 3 * * THE FOLLOWING TABLES WORK IN PAIRS TO SPECIFY MAPPING FROM ONE FORMAT * LEVEL TO ANOTHER, I.E., FROM1-TO0, FROM2-TO1, ETC. THE SAME OFFSET IS * USED INTO BOTH TABLES FOR EACH WORD THAT IS TRANSFERRED. * * THE "FROM" HALF SPECIFIES AN OFFSET FOR EVERY WORD TO BE TRANSFERRED TO * THE NEXT LEVEL. THE FIRST AND SECOND WORDS SPECIFY THE SIZE OF THE * HEADER FOR THE REQUEST AND REPLY, RESPECTIVELY. THE THIRD WORD INDICATES * THE # OF *REQUEST* WORDS TO BE MOVED (NEG) TO THE NEXT LOWER FORMAT LEVEL. * * THE "TO" HALF SPECIFIES THE TARGET OFFSET INTO THE OLDER FORMAT WHERE * THE CORRESPONDING WORD FROM THE NEWER FORMAT IS TO BE STORED. THE FIRST * AND SECOND WORDS SPECIFY THE SIZE OF THE HEADER FOR THE REQUEST AND * REPLY, RESPECTIVELY. THE THIRD WORD INDICATES THE # OF *REPLY* WORDS * TO BE MOVED (NEG) TO THE NEXT LOWER FORMAT LEVEL. * * WARNING: THE SIZE OF THE FORMAT LEVEL 0 REQUEST HEADER AT "TO0" IS * TEMPORARILY MODIFIED BY OTCNV FOR PTOP AND DLIST (7 WORD HEADER) * REQUESTS. * SPC 3 FROM1 DEC 13 SIZE OF FORMAT 1 REQUEST HEADER. DEC 13 SIZE OF FORMAT 1 REPLY HEADER. DEC -4 NEG. # WORDS TRANSFERRED IF *REQUEST*. B1 DEC 1 WORD 1 = STREAM WORD. DEC 2 WORD 2 = SEQUENCE #. DEC 3 WORD 3 = SOURCE NODE #. B4 DEC 4 WORD 4 = DEST. NODE #. DEC 5 WORD 5 = EC1. B6 DEC 6 WORD 6 = EC2. B7 DEC 7 WORD 7 = ERROR NODE NUMBER. * FROM2 DEC 0 RESERVED FOR LEVEL 2 CONVERTER. * . * . * . SPC 2 TO0 DEC 4 SIZE OF FORMAT 0 REQUEST HEADER. DEC 7 SIZE OF FORMAT 0 REPLY HEADER. DEC -7 NEG. # WORDS TRANSFERRED IF *REPLY*. DEC 1 WORD 1 = STREAM WORD. DEC 2 WORD 2 = SEQUENCE #. DEC 3 WORD 3 = SOURCE NODE #. DEC 4 WORD 4 = DEST. NODE #. DEC 5 WORD 5 = EC1. DEC 6 WORD 6 = EC2. DEC 7 WORD 7 = ERROR NODE NUMBER. * TO1 DEC 0 RESERVED FOR LEVEL 2 CONVERTER. * . * . * . SKP A EQU 0 B EQU 1 * OTCNV JSB DTACH DETACH FROM POSSIBLE SESSION. DEF *+1 * LDA TO0 SAVE SIZE OF FORMAT LEVEL 0 STA SAVET REQUEST HEADER. * * GET A REQUEST TO BE CONVERTED (FORMAT LEVEL SHOULD BE THAT * OF NODE IN WHICH OTCNV IS RUNNING). * OTGET LDA RQBA RESET ADDR OF OUTPUT BUFFER. STA RQADR LDA SAVET RESTORE SIZE OF FORMAT LEVEL 0 STA TO0 REQUEST HEADER. * CLA CLEAR ERROR FLAG. STA TEMP * JSB #GETR GET A REQUEST (AND DATA). DEF *+6 DEF #OTCV CLASS # FOR OTCNV. RQBA DEF RQB INTERNAL REQUEST BUFFER. DEF C#MAX MAXIMUM REQUEST LENGTH. DEF #CVBF+1 EXTERNAL DATA BUFFER. DEF #CVBF MAXIMUM DATA LENGTH. ISZ TEMP ERROR RETURN. SET FLAG. * STA RQLEN SAVE ACTUAL REQUEST LENGTH. STB DAINL SAVE ACTUAL DATA LENGTH. * JSB EXEC CLEAR BUFFER IN S.A.M. DEF *+5 DEF CLS21 DEF #OTCV DEF #CVBF+1 DEF B0 NOP IGNORE ERROR RETURN. * LDA TEMP ERROR ON ORIGINAL "GET"? SZA JMP OTGET YES. * LDA RQB+#STR NO. IF REPLY, RAL SSA,RSS JMP GTFMT LDA RQB+#ENO AND #ENO BIT 15 IS SET, SSA,RSS JMP GTFMT LDA RQB+#EC1 AND #EC1 = "DS", CLB CPA "DS" STB DAINL CHOP OFF THE DATA. * * GET FORMAT LEVEL # OF RECEIVED REQUEST (SHOULD BE LEVEL OF NODE * IN WHICH OTCNV IS RUNNING). * GTFMT LDB RQB+#STR FIRST CHECK BIT 12 OF STREAM WORD. BLF SLB,RSS JSB LOST ERROR (NO RETURN ON JSB). LDA RQB+#LVL GET "FORMAT LEVEL" WORD. AND B17 ISOLATE BITS 0-3. ADA N1 DECREMENT DOWN ONE LEVEL. STA NXTLV SAVE AS "NEXT LEVEL". * LDA RQB+#STR GET REPLY BIT IN LSB. RAL,RAL AND B1 STA ADJMT 0 = REQUEST, 1 = REPLY. LDB RQB+#DST GET DESTINATION NODE SZA (DEPENDS WHETHER REQUEST OR REPLY). LDB RQB+#SRC STB DSTND * JSB #NRVS SEARCH THE NRV FOR THE NODE #. DEF *+4 DEF DSTND DEF TEMP DEF OLEVL FORMAT LEVEL # OF DEST. NODE. JSB LOST ERROR (NO RETURN ON JSB). * IOR BIT15 BYPASS SESSION SST. STA DSTLU SAVE LU FOR DEST. NODE. LDA NXTLV INCOMING LEVEL MINUS 1. CMA NEGATIVE INCOMING LEVEL (ACTUAL). ADA OLEVL ADD DESTINATION LEVEL #. SSA,RSS JMP SFAIL ERROR IF DEST LEVEL .GE. INCOMING LEVEL. * * STORE DESTINATION FORMAT LEVEL NUMBER IN THE REQUEST NOW (BECAUSE * WE ONLY HAVE THE GLOBAL EQUATE BLOCK FOR THE LEVEL OF THIS NODE). * LDA OLEVL CHECK LEVEL OF DESTINATION NODE. SZA JMP LV1UP * LDA RQADR,I CLEAR BIT 12 (IF DEST. = LEVEL 0). AND NOT12 STA RQADR,I JMP NXLEV * LV1UP LDB RQADR STORE DESTINATION LEVEL NUMBER. ADB C#LVL LDA B,I AND B7760 IOR OLEVL STA B,I * * IF CONVERTING PTOP OR DLIST REQUEST TO FORMAT LEVEL 0, MODIFY * THE HEADER SIZE SPECIFICATION AT "TO0". * NXLEV LDA ADJMT ADA NXTLV COMBINE ADJMT AND NXTLV. SZA IF BOTH ARE ZERO JMP BCONV (CONVERTING REQ TO LEVEL 0), LDA RQADR,I CHECK STREAM WORD OF REQUEST. AND B77 CLB SET DEFAULT MOD = NONE. SZA IF STREAM ZERO, CPA B1 OR DLIST, RSS CPA B4 OR PTOP, LDB B7 SET MOD = 7 WORD HEADER. SZB STB TO0 STORE NEW SIZE IF REQUIRED. * * BEGIN CONVERSION TO NEXT LOWER LEVEL. * BCONV LDB NXTLV FIND "FROM" INDEX TABLE. ADB FMTBL LDB B,I GET POINTER TO REQ HEADER SIZE. STB FPTR ADB ADJMT IF REPLY, BUMP POINTER. STB FSZPT POINTER TO "FROM" HEADER SIZE. LDA B,I GET SIZE OF THE HEADER (POS.). ADA RQADR ADD TO START OF HEADER. STA BODAD ADDRESS OF BODY OF REQUEST. ISZ FPTR ISZ FPTR POINT TO # WORDS TO MOVE (IF REQUEST). * * CLEAR THE TEMPORARY BUFFER. * LDA TMPBF STA TPTR LDB N#HDR CLA CLRTM STA TPTR,I ISZ TPTR INB,SZB JMP CLRTM * * MOVE CURRENT HEADER TO TEMPORARY BUFFER (NEWER FORMAT). * LDA RQADR LDB TMPBF JSB .MVW DEF FSZPT,I NOP * * SET UP POINTERS AND COUNTERS FOR OLDER FORMAT. * LDB NXTLV FIND "TO" INDEX TABLE. ADB TOTBL LDB B,I GET POINTER TO REQ HEADER SIZE. STB TPTR ADB ADJMT IF REPLY, BUMP POINTER. STB TSZPT POINTER TO "TO" HEADER SIZE. LDA B,I GET THE SIZE OF THE HEADER. CMA,INA STA TEMP SAVE FOR CLEARING BUFFER. ADA BODAD STA RQADR ADDR OF OLDER HEADER. * LDA FSZPT,I COMPUTE DIFFERENCE IN SIZE CMA,INA FROM OLDER TO NEWER FORMAT. ADA TSZPT,I ADA RQLEN ADD TO CURRENT SIZE. STA RQLEN ISZ TPTR ISZ TPTR POINT TO # WORDS TO MOVE (IF REPLY). * * CLEAR TARGET AREA FOR OLDER FORMAT OF REQUEST. * LDB RQADR CLA CLEAR STA B,I INB ISZ TEMP JMP CLEAR * * CONVERT FROM NEWER FORMAT TO NEXT LOWER LEVEL * LDA FPTR,I GET # WORDS TO MOVE FOR REQUEST. LDB ADJMT SZB IF REPLY, LDA TPTR,I CHANGE TO # WORDS TO MOVE FOR REPLY. STA TEMP ISZ FPTR ISZ TPTR * CONV LDA FPTR,I GET A WORD-INDEX INTO NEWER FORMAT. ADA N1 ADJUST TO ZERO. ADA TMPBF ADDR OF WORD IN NEWER FORMAT REQUEST. LDA A,I CONTENTS OF WORD. LDB TPTR,I GET A WORD-INDEX INTO OLDER FORMAT. ADB N1 ADJUST TO ZERO. ADB RQADR ADDR OF WORD IN OLDER FORMAT REQUEST. STA B,I STORE FROM NEW TO OLD LOCATION. * ISZ FPTR BUMP POINTERS. ISZ TPTR ISZ TEMP INCR. # WORDS TO MOVE. JMP CONV LOOP TILL DONE. * * PERFORM REQUEST-SPECIFIC CONVERSION, IF ANY. * LDB NXTLV GET CURRENT LEVEL NUMBER. ADB SPECL ADD TO TABLE OF REQUEST-SPECIFIC LDB B,I ROUTINES AND GO DO IT. STB TEMP LDA RQADR LDB RQLEN JSB TEMP,I JMP ERROR ERROR RETURN. STB RQLEN SAVE POSSIBLY MODIFIED LENGTH. * * CHECK IF ANOTHER LEVEL. * LDA NXTLV CPA OLEVL REACHED LEVEL # OF DEST NODE? JMP SEND YES. ADA N1 NO. DECR TO NEXT LOWER LEVEL #. STA NXTLV JMP NXLEV KEEP ON CONVERTING. * * CONVERSION COMPLETED. * SEND LDA RQLEN ADA RQADR STA BODAD CLB TSTLN LDA RQLEN CMA,INA IF REQUEST LENGTH IS ADA B6 LESS THAN 7 WORDS, SSA JMP CONF STB BODAD,I PAD IT OUT TO 7. ISZ BODAD ISZ RQLEN JMP TSTLN * * SEND CONVERTED REQUEST TO DRIVER ON GRPM'S CLASS. * CONF LDA RQLEN ADD NUMBER OF WORDS ADA C#LSZ IN LOCAL APPENDAGE AREA STA RQLEN FOR THIS (SENDING) NODE. * LDA RQADR,I GET STREAM WORD. AND MSK CLEAR RETRY CNTRS. IOR #BREJ INITIALIZE TO REQUIRED VALUE. STA RQADR,I * LDA #GRPM SET UP TO SEND TO GRPM. STA CLASS * SHIP JSB XLUEX SEND REQUEST. DEF *+8 DEF CLS20 DEF DSTLU DESTINATION LU. DEF #CVBF+1 ADDRESS OF DATA BUFFER. DEF DAINL DATA LENGTH. RQADR NOP ADDRESS OF NEW REQUEST. DEF RQLEN LENGTH OF NEW REQUEST. DEF CLASS GRPM'S OR INCNV'S CLASS. JSB LOST ERROR. (NO RETURN ON JSB). * JMP OTGET GO GET NEXT MESSAGE. * * ERROR IN REQUEST-SPECIFIC ROUTINE. CONVERSION HAS GONE DOWN AT LEAST * ONE LEVEL. ERROR REPLY CAN BE ANY LEVEL BELOW THAT OF NODE IN WHICH * OTCNV IS RUNNING. SEND TO INCNV TO CONVERT BACK UP. * ERROR LDA #INCV CLASS # FOR INCNV. STA CLASS CLA STA DSTLU JMP SHIP GO SEND TO INCNV. * * REPORT ERROR IN NODAL ROUTING VECTOR (NRV). * SFAIL LDA NXTLV INA FORMAT LEVEL # RECEIVED. CCE JSB $CVT1 STA EMSG+7 * LDB RQADR SOURCE NODE NUMBER. ADB C#SRC (RELATIVE POSITION FROM LEVEL LDA B,I TO LEVEL IS NOT SUPPOSED TO STA TEMP CHANGE!) * JSB CNUMD DEF *+3 DEF TEMP DEF EMSG+15 * JSB REIO DISPLAY ON SYS CONSOLE. DEF *+5 DEF ICOD2 DEF B1 DEF EMSG DEF ELEN NOP IGNORE ERROR RETURN. * JSB LOST (NO RETURN ON JSB) * EMSG ASC 18, RECV'D LEVEL XX MSG FROM NODE XXXXX ELEN DEC 18 SPC 5 * * DUMMY REQUEST-SPECIFIC CONVERSION ROUTINE. * NULL NOP JMP NULL,I SKP * * IF WE CAN'T SEND REPLY, SEND IT TO QCLM (CAN BE ANY FORMAT LEVEL). * LOST NOP (JSB FOR COMPUTING ADDRESS) LDA RQADR,I IS IT A REPLY? RAL SSA,RSS JMP OTGET NO. * LDB RQADR YES. SEND IT TO QCLM. ADB B4 STB TEMP POINT TO WORD 5 OF "QCLM BUFFER". LDA @OTCN GET BASE ADDRESS OF "OTCNV". CMA,INA GET RELATIVE ERROR ADDRESS ADA LOST AND STA TEMP,I PASS ERROR ADDR TO QCLM. ISZ TEMP DLD "DS08 SET ERROR TO "DS08". DST TEMP,I ISZ TEMP ISZ TEMP DLD $TIME RECORD TIME OF ERROR. DST TEMP,I ISZ TEMP ISZ TEMP LDA PNAME PASS NAME OF "OTCNV". STA TEMP,I ISZ TEMP DLD PNAME+1 DST TEMP,I * LDA #QCLM GET CLASS NUMBER FOR QCLM. SZA,RSS JMP OTGET IF NO QCLM, FORGET MESSAGE. * JSB EXEC MAILBOX WRITE/READ TO QCLM. DEF *+8 DEF CLS20 DEF B0 DEF RQADR,I DEF D12 DEF B1 TYPE 1. DEF B0 DEF #QCLM NOP IGNORE ERROR RETURN. * JMP OTGET GO BACK TO GET NEXT MESSAGE. SKP * * CONSTANTS AND STORAGE. * B0 OCT 0 B17 OCT 17 B77 OCT 77 N1 DEC -1 D12 DEC 12 BIT15 OCT 100000 ICOD2 OCT 100002 CLS20 OCT 100024 CLS21 OCT 100025 CLASS NOP NOT12 OCT 167777 B7760 OCT 177760 MSK OCT 170077 "DS" ASC 1,DS "DS08 ASC 1,DS08 PNAME ASC 3,OTCNV @OTCN DEF BASE * NXTLV NOP OLEVL NOP FPTR NOP TPTR NOP BODAD NOP DAINL NOP RQLEN NOP FSZPT NOP TSZPT NOP ADJMT NOP TEMP NOP DSTND NOP DSTLU NOP OCT 10100 (DSTLU+1) "Z" BIT & "WRITE". SAVET NOP * N#HDR ABS -HDR C#MAX ABS MAX C#LVL ABS #LVL C#SRC ABS #SRC C#LSZ ABS #LSZ * * TEMPORARY BUFFER TO HOLD OLDER FORMAT OF REQUEST. * TMPBF DEF *+1 BSS HDR * * BUFFER FOR CURRENT REQUEST AND HEADER EXPANSION. * RQB BSS MAX+#LSZ BUFFER FOR INCOMING REQUEST. * BSS 0 SIZE OF MODULE (+ #CVBF). * END OTCNV