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 
                                                                                                                                                      