ASMB,R,L,C
      HED @DEQ - 91705-16103 * (C) HEWLETT-PACKARD CO. 1976 
      NAM @DEQ,6 91705-16103 REV A 760323 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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 
* 
* @DEQ
* SOURCE: 91705-18103 
* BINARY: 91705-16103 
* JIM HARTSELL
* AUG. 30, 1974 
* 
* RE-ENTRANT SUBROUTINE FOR RTE-C SATELLITE 
* RESIDENT LIBRARY TO PROCESS COMPLETION
* OF A REMOTE CALL TO THE CENTRAL STATION.
* 
* CALLING SEQUENCE: (CALLED BY @REFA, @INTR)
* 
*         JSB @DEQ
*         OCT QUEUE ENTRY ADDR
*         OCT ICODE 
*          ERROR RETURN 
*          NORMAL RETURN
* 
*    WHERE: 
*          ICODE = 0 USED BY @REFA FOR NORMAL 
*                    COMPLETION. IF ERROR RETURN, 
*                    THE REPLY BUFFER WILL CONTAIN
*                    AN ASCII ERROR MESSAGE.
* 
*                = 1 USED BY @INTR TO 
*                    RETURN A QUEUE ENTRY TO THE
*                    DORMANT LIST WHEN A USER HAS 
*                    BEEN ABORTED BEFORE HIS
*                    REQUEST HAS COMPLETED SERVICE. 
*                    NORMAL RETURN ALWAYS TAKEN.
* 
      ENT @DEQ
* 
      EXT $LIBR,$LIBX 
      EXT %DORM,%ACT
* 
A     EQU 0 
B     EQU 1 
* 
****************************************
* 
* BEGIN TEMPORARY DATA BLOCK. 
* 
TDB   NOP 
      DEC 14        LENGTH OF BLOCK.
RETRN NOP           RETURN ADDR OF CALLER.
TEMP1 NOP           TEMPORARY DATA. 
TEMP2 NOP 
TEMP3 NOP 
RTNFG NOP           FLAG RETURNED IN E-REG. 
FCN   NOP           FUNCTION CODE.
REPLY NOP           ADDR OF REPLY BUFFER. 
P.PTR NOP           PTR TO USER CALL PARAMS.
I.PTR NOP           PTR TO REPLY BUFR PARAMS. 
CALL  NOP           ADDR OF USER CALL +1. 
*      PASSED PARAMETERS: 
QENT  NOP           ADDR OF QUEUE ENTRY.
ICODE NOP           REQUEST CODE. 
* 
* END OF TEMPORARY DATA BLOCK.
* 
****************************************
* 
* 
@DEQ  NOP           ENTRY POINT.
* 
      JSB $LIBR     SAVE TEMPORARY DATA.
      DEF TDB 
* 
      JSB $LIBR 
      NOP 
* 
      LDA @DEQ,I    FETCH CALL PARAMETERS.
      STA QENT
      ISZ @DEQ
      LDA @DEQ,I
      STA ICODE 
      ISZ @DEQ
      LDA @DEQ
      STA RETRN     SET RETURN ADDRESS. 
* 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
* 
* CHECK REQUEST CODE. 
* 
      CLA 
      STA RTNFG 
      LDA ICODE 
      SZA           IF NON-ZERO,
      JMP DEQUE     ABORT THE REQUEST.
* 
* NORMAL COMPLETION OF REMOTE REQUEST.
* 
      LDB QENT      GET FUNCTION CODE.
      ADB B7        (FROM QUEUE ENTRY)
      LDA B,I 
      AND B377      MASK. 
      STA FCN       SAVE. 
* 
      INB           SAVE ADDR OF USER CALL. 
      LDA B,I 
      STA CALL
      ADA B2        SET POINTER TO USER CALL
      STA P.PTR     PARAMETERS (IERR OR ICODE). 
* 
      INB           SAVE ADDR OF REPLY BUFFER.
      LDA B,I 
      STA REPLY 
* 
      ADA B4        SET POINTER TO REPLY BUFFER 
      STA I.PTR     RETURN PARAMETERS.
* 
      LDA FCN       TEST FUNCTION CODE. 
      CPA D9
      JMP .GTLU     GETLU.
      CPA D10 
      JMP .DLST     DLIST.
      SZA,RSS 
      JMP .DNLD     DOWN-LOAD.
      CPA D200
      JMP .RMCN     REMOTE CONTROL. 
      ADA MD150 
      SSA 
      JMP .PTOP 
      ADA MD13
      SZA,RSS 
      JMP .EXEC 
* 
* REMOTE FILE ACCESS COMPLETION.
* 
      LDA REPLY     IF A-REG SLOT IS NON-ZERO,
      ADA B2        STORE THE ERROR CODE IN 
      LDB A,I       THE IERR SLOT OF REPLY BUFFER.
      ADA B2
      SZB 
      STB A,I 
* 
      LDA I.PTR,I   PASS IERR TO USER CALL, 
      LDB FCN       EXCEPT FOR DSTAT. 
      CPB D162
      RSS 
      JSB RWORD 
      ISZ I.PTR 
* 
      SSA           IF IERR WAS NEGATIVE, DON'T 
      JMP DEQUE     PASS OTHER RETURN PARAMS. 
* 
      LDB FCN 
      CPB D154      REMOTE FILE READ? 
      RSS 
      JMP CMPL1     NO. 
      ISZ P.PTR     MOVE PARAM POINTER. 
      ISZ P.PTR 
      LDA I.PTR,I   RETURN XMSN LOG.
      JSB RWORD 
      JMP DEQUE 
* 
CMPL1 CPB D160      LOCATE REMOTE RECORD? 
      RSS 
      JMP DEQUE     NO. 
      LDB MD7       YES. RETURN N PARAMS. 
      JSB PINTG 
      JMP DEQUE 
* 
* REMOTE EXEC CALL COMPLETION.
* 
.EXEC LDA REPLY     CHECK A-REG SLOT OF REPLY 
      ADA B2        BUFFER FOR ERROR CODES. 
      LDA A,I 
* 
      LDB AS.01 
      CPA MD51
      JMP SETER     LINE DOWN.
      CPA MD10
      JMP MSSNG     MISSING PARAM.
* 
      CPA MD1       ERROR FROM CENTRAL? 
      JMP CMPL6     YES 
* 
      LDB AS.02 
      CPA MD52
      JMP SETER     PARITY ERROR. 
* 
      LDB AS.00 
      CPA MD103 
      JMP SETER     SOFTWARE BUG! 
* 
      CPA AS.IO     CENTRAL I/O ERROR.
      JMP BOUNC 
* 
      CPA AS.SC     CENTRAL SCHEDULE ERROR. 
      JMP BOUNC 
* 
      CPA AS.DS     DS ERROR. 
      JMP BOUNC 
* 
      CPA AS.RQ     ILLEGAL REQUEST CODE. 
      JMP BOUNC 
* 
      LDA P.PTR,I   GET REQUEST CODE. 
      JSB INDCK 
      LDA A,I 
      STA TEMP3 
      ELA,CLE,ERA   TAKE OFF SIGN BIT.
      ISZ P.PTR     SKIP PAST IT. 
* 
      CPA D11       REMOTE TIME CALL? 
      RSS 
      JMP CMPL2     NO. 
      LDA MD5       YES. RETURN TIME ARRAY. 
      JSB PNWDS 
      JMP CMPL3     GO DE-QUE THE ENTRY.
* 
CMPL2 CPA D13       REMOTE I/O STATUS?
      RSS 
      JMP CMPL3     NO. 
      ISZ P.PTR     YES. SKIP OVER CONTROL WORD.
      LDB MD2 
      JSB PINTG     PASS PARAMETERS.
* 
CMPL3 LDA TEMP3     TAKE NORMAL RETURN IF SIGN BIT
      SSA           SET.
      ISZ RTNFG 
      JMP DEQUE 
* 
CMPL6 LDA REPLY 
      ADA B3
      LDA 0,I       GET REPLY+3 
      CPA D11       LENGTH ERROR? 
      RSS           YES 
      JMP MSSNG     TREAT AS IO01 
      LDB AS.03     GIVE DS03 
      JMP SETER 
* 
* PROGRAM TO PROGRAM COMMUNICATION COMPLETION.
* 
.PTOP LDA I.PTR     BACK UP REPLY BUFFER POINTER. 
      ADA MD2 
      STA I.PTR 
      CLA           PREPARE FOR NO ERROR. 
      LDB I.PTR,I   GET FLAG WORD.
      SSB 
      INA           SET IERR=1 IF REJECTED. 
      ISZ I.PTR 
      LDB I.PTR,I   GET ERROR WORD. 
      SZB           RETURN 0 OR 1 IF NO ERROR.
      LDA B         HAD ERROR. RETURN NEG CODE. 
      CPA MD11      MAP ERROR CODES.
      LDA MD44
      CPA MD10
      LDA MD40
      CPA MD51
      LDA MD47
      CPA MD52
      LDA MD48
      STA I.PTR,I 
      JSB RWORD 
      ISZ I.PTR 
      ISZ I.PTR 
* 
      LDA P.PTR     RESET POINTER TO PCB AREA.
      ADA MD2 
      STA P.PTR 
* 
      LDA MD3       IF POPEN, MOVE ID INFO TO PCB.
      LDB FCN 
      CPB B1
      JSB PNWDS 
* 
      ISZ P.PTR     SET POINTER TO ITAG PARAM.
      ISZ P.PTR 
      LDB P.PTR 
      LDA FCN 
      CPA B1        ADJUST REPLY POINTER. 
      JMP *+4 
      ISZ I.PTR 
      ISZ I.PTR 
      ISZ I.PTR 
* 
      CPA B4
      JMP PTP1
      ADB B2
      STB P.PTR 
* 
PTP1  LDA MD10      PASS TAG FIELD TO USER. 
      JSB PNWDS 
* 
      JSB DEQ       DE-QUE THE REQUEST. 
      LDB REPLY     RETURN A = IERR.
      ADB B3
      LDA B,I 
      CLE 
      JMP EXIT
* 
* SPECIAL DLIST CALL COMPLETION.
* 
.DLST LDA P.PTR     MOVE PARAM POINTER. 
      ADA B6
      STA P.PTR 
* 
LSTLD LDA I.PTR     BACK UP REPLY BUFFER POINTER. 
      ADA MD2 
      STA I.PTR 
* 
      LDB MD3       PASS 3 PARAMS TO USER.
      JSB PINTG 
* 
      JMP DEQUE 
* 
* SPECIAL DOWN-LOAD CALL COMPLETION.
* 
.GTLU BSS 0 
.DNLD LDA P.PTR 
      ADA MD1 
      STA P.PTR 
* 
      LDA REPLY     CHECK FOR XMSN ERRORS.
      ADA B3
      LDA A,I 
      LDB AS.01 
      CPA MD51
      JMP SETER     LINE DOWN.
      LDB AS.00 
      CPA MD103 
      JMP SETER     SYSTEM ERROR. 
* 
      JMP LSTLD 
* 
* SPECIAL REMOTE CONTROL COMPLETION.
* 
.RMCN LDA P.PTR     BACK UP PARAM POINTER.
      ADA MD1 
      STA P.PTR 
      ISZ I.PTR     BUMP REPLY BUFFER POINTER.
      LDA I.PTR,I   RETURN MESSAGE LENGTH.
      JSB RWORD 
      ISZ I.PTR 
      LDA MD19      RETURN ASCII MESSAGE. 
      JSB PNWDS 
      JMP DEQUE 
* 
* STORE ASCII ERROR CODES IN REPLY BUFFER.
*    (FOR REMOTE EXEC AND DOWN-LOAD CALLS)
* 
MSSNG CCE,RSS 
SETER CLE 
      LDA REPLY     REPLY BUFFER ADDRIN B-REG 
      ADA B2        3RD WORD
      STA ERDST+1   SAVE ADDR FOR ERROR CODE STORE
      LDA AS.DS     "DS". 
      SEZ 
      LDA AS.IO     "IO"
ERDST DST *         SET ASCII ERROR CODE
* 
      LDA FCN       CHECK FOR DOWN-LOAD.
      SZA,RSS 
      JMP EMESG 
* 
BOUNC LDA P.PTR,I   CHECK SIGN BIT OF RCODE.
      JSB INDCK 
      LDA A,I 
      SSA,RSS       IS IT SET?
      JMP EMESG     NO. ABORT THE USER. 
* 
DEQUE JSB DEQ       DE-QUE THE REQUEST. 
* 
* 
* SET THE A AND B REGISTERS TO THEIR VALUE AFTER
* THE REMOTE CALL WAS EXECUTED AT CENTRAL.
* 
      LDA RTNFG     SET E IF NORMAL DEXEC RETURN
      ERA           WHEN RCODE SIGN BIT SET.
      LDB REPLY 
      ADB B2
      DLD 1,I       GET REGS FROM REPLY BUFFER
* 
* EXIT TO CALLER VIA NORMAL RETURN. 
* 
EXIT  JSB $LIBX     RESTORE TEMPORARY DATA BLOCK. 
      DEF TDB 
      DEC 1 
* 
* GENERATE AN ERROR MESSAGE OF THE FORM 
* 
*       IOXXR PRGNM  ADDR 
*       PRGNM ABORTED    -OR- PRGNM SUSPEND 
* 
* IN THE REPLY BUFFER AND RETURN VIA ERROR EXIT.
* 
EMESG LDA REPLY     SET STORE POINTER.
      STA I.PTR 
* 
      ADA B2
      LDB MD2 
      JSB PACK      STORE "IOXX". 
* 
      LDA AS.R      STORE "R" SUFFIX IF NOT DSP ERROR.
      LDB REPLY,I 
      CPB AS.DS 
      LDA BLANK 
      STA I.PTR,I 
      ISZ I.PTR 
* 
      LDA XEQT,I    GET ADDR OF PROGRAM NAME
      ADA D12 
      LDB MD3       IN ID SEGMENT.
      JSB PACK      STORE "PRGNM".
* 
      LDB CALL      GET ADDR OF VIOLATING 
      ADB MD1       USER CALL.
      LDA I.PTR     ADDRESS OF ASCII STORAGE. 
      JSB CONV      CONVERT TO ASCII OCTAL & STORE. 
      STA I.PTR     SET STORE POINTER.
* 
      LDA CRLF      STORE CR/LF.
      STA I.PTR,I 
      ISZ I.PTR 
* 
      LDA XEQT,I    STORE PROGRAM NAME AGAIN
      ADA D12 
      LDB MD3       IN SECOND LINE. 
      JSB PACK
* 
      LDB REPLY    ADDR OF REPLY BUFFER.
      LDA B,I      WORD 1.
      CPA AS.DS    = "DS" ? 
      JMP WORD2    YES. GO CHECK WORD 2.
ABRT  LDA ABMSG    NO. STORE "ABORTED". 
      LDB MD4 
      JSB PACK
      JSB DEQ      DE-QUE THE REQUEST.
      CLA 
      JMP EREX
* 
WORD2 INB 
      LDA B,I      WORD 2.
      CPA AS.01    = "01" ? 
      RSS 
      JMP ABRT     NO. STORE "ABORTED". 
      LDA SUMSG    YES. STORE "SUSPEND".
      LDB MD4 
      JSB PACK
      CLA,INA 
* 
EREX  JSB $LIBX     RESTORE TDB AND TAKE
      DEF TDB       ERROR EXIT. 
      DEC 0 
      HED @DEQ - UTILITY SUBROUTINES * (C) HEWLETT PACKARD CO. 1976 
* SUBROUTINE TO RETURN COMPLETED ACTIVE QUEUE ENTRY TO
* THE DORMANT LIST. 
* 
DEQ   NOP 
      JSB $LIBR     DISABLE THE INTERRUPT SYSTEM. 
      NOP 
* 
      LDA %DORM     FIND END OF DORMANT LIST. 
      CLB 
      JSB FINDR 
* 
      LDA QENT      LINK TO RELEASED ENTRY. 
      STA B,I 
* 
      LDA %ACT      FIND PREVIOUS ACTIVE ENTRY. 
      LDB QENT
      LDB B,I 
      JSB FINDR 
* 
      LDB QENT      LINK IT AROUND RELEASED ENTRY.
      LDB B,I       (IF IT WAS NOT THE LAST ENTRY 
      SZA           IN THE ACTIVE LIST) 
      STB A,I 
      CLA           CLEAR LINK IN RELEASED ENTRY. 
      LDB QENT
      STA B,I 
      INB           CLEAR FLAG WORD.
      STA B,I 
* 
      JSB $LIBX     ENABLE INTERRUPT SYSTEM.
      DEF DEQ       RETURN. 
* 
* SUBROUTINE TO FIND END OF LIST OR PARTICULAR
* ENTRY IN THE PARMB REQUEST QUEUE. THIS ROUTINE
* IS CALLED WITH THE INTERRUPT SYSTEM DISABLED. 
*   ENTRY: (A) = ADDR OF PTR TO TOP OF LIST.
*          (B) = 0 FOR END OF LIST, OR
*              = LINK WORD FOR PARTICULAR ENTRY.
*          JSB FINDR
*   RETURN:   (A) = ADDR OF PREVIOUS ENTRY. 
*             (B) = ADDR OF ENTRY.
* 
FINDR NOP 
      STB TEMP3 
      CLB 
      STB TEMP2     INITIAL PREVIOUS ENTRY. 
* 
F1    LDB A,I       FETCH NEXT ENTRY. 
      CPB TEMP3     DESIRED ENTRY?
      JMP F2        YES.
      STA TEMP2     NO. KEEP TRACK. 
      STB A 
      JMP F1
* 
F2    LDB A         ADDR OF ENTRY.
      LDA TEMP2     ADDR OF PREVIOUS ENTRY. 
      JMP FINDR,I   RETURN. 
* 
* PASS N-WORD PARAM TO USER PROGRAM.
* (DOES NOT BUMP P.PTR) 
* 
PNWDS NOP 
      STA TEMP1     NEGATIVE WORD COUNT.
      JSB PCHEK     IS PARAM SPECIFIED? 
      JMP PNWDS,I   NO. IGNORE THE CALL.
      LDA P.PTR,I   GET PARAM ADDRESS.
      JSB INDCK 
TLOOP LDB I.PTR,I   MOVE N WORDS. 
      STB A,I 
      ISZ I.PTR 
      INA 
      ISZ TEMP1 
      JMP TLOOP 
      JMP PNWDS,I 
* 
* PASS N PARAMS TO USER PROGRAM. (B) = -N.
* 
PINTG NOP 
      STB TEMP2 
PLOOP LDA I.PTR,I 
      JSB RWORD 
      ISZ I.PTR 
      ISZ TEMP2 
      JMP PLOOP 
      JMP PINTG,I 
* 
* PASS A-REG CONTENTS TO USER PARAMETER, IF SPECIFIED.
* 
RWORD NOP 
      STA TEMP1 
      JSB PCHEK     IS PARAM SPECIFIED? 
      JMP RWORD,I   NO. IGNORE THE CALL.
      LDB TEMP1     YES.
      LDA P.PTR,I 
      JSB INDCK 
      STB A,I 
      LDA TEMP1 
      ISZ P.PTR 
      JMP RWORD,I 
* 
* TEST WHETHER THE USER HAS SPECIFIED A PARAMETER.
*     JSB PCHEK 
*      ERROR RETURN (PARAM NOT GIVEN) 
*      NORMAL RETURN
* 
PCHEK NOP 
      LDA P.PTR     PARAM ADDRESS.
      CMA,INA 
      ADA CALL,I    RETURN ADDRESS. 
      ADA MD1 
      SSA,RSS 
      ISZ PCHEK 
      JMP PCHEK,I 
* 
* RESOLVE INDIRECT PARAMETER ADDRESSES. 
* 
INDCK NOP 
      RSS 
      LDA A,I 
      RAL,CLE,SLA,ERA 
      JMP *-2 
      JMP INDCK,I 
* 
* MOVE WORDS TO USER REPLY BUFFER.
* (A) = SOURCE ADDR, (B) = NEGATIVE WORD COUNT. 
* 
PACK  NOP 
      STB TEMP1 
CLOOP LDB A,I 
      STB I.PTR,I 
      INA 
      ISZ I.PTR 
      ISZ TEMP1 
      JMP CLOOP 
      JMP PACK,I
* 
* CONVERT 15-BIT BINARY NUMBER TO 6 CHARACTER 
* (LEADING BLANK) ASCII FORM OF OCTAL.
* 
CONV  NOP 
      STA TEMP1     SAVE STORAGE ADDRESS. 
      RBL           POSITION FIRST DIGIT TO BITS 15-13. 
      LDA MD3 
      STA TEMP2     CONVERT COUNTER = -3. 
      LDA B40       MAKE FIRST CHAR A SPACE.
CONV1 ALF,ALF       ROTATE CAHR TO UPPER POSITION 
      STA TEMP3     AND SAVE. 
      BLF,RBR       POSITION NEXT DIGIT TO BITS 2-0.
      LDA B 
      AND B7        ISOLATE DIGIT.
      IOR B60       MAKE AN ASCII CHAR (60-67). 
      IOR TEMP3     PACK IN UPPER CHAR
      STA TEMP1,I   AND STORE IN STORAGE AREA.
      ISZ TEMP1     BUMP STORAGE ADDRESS. 
      BLF,RBR       ROTATE NEXT DIGIT TO LOW BYTE.
      LDA B         ISOLATE CHAR IN LOW A.
      AND B7
      IOR B60       MAKE AN ASCII CHAR. 
      ISZ TEMP2     BUMP CONVERT COUNTER. 
      JMP CONV1     NOT FINISHED. 
      LDA TEMP1     FINISHED. SET (A) = NEXT STORAGE
      JMP CONV,I    AREA WORD ADDRESS, AND EXIT.
      HED @DEQ - STORAGE FOR CONSTANTS * (C) HEWLETT PACKARD CO. 1976 
XEQT  OCT 1717      ID SEG ADDR OF CURRENT PROGRAM. 
B1    OCT 1 
B2    OCT 2 
B3    OCT 3 
B4    OCT 4 
B6    OCT 6 
B7    OCT 7 
B40   OCT 40
B60   OCT 60
B377  OCT 377 
D9    DEC 9 
D10   DEC 10
D11   DEC 11
D12   DEC 12
D13   DEC 13
D154  DEC 154 
D160  DEC 160 
D162  DEC 162 
D200  DEC 200 
MD1   DEC -1
MD2   DEC -2
MD3   DEC -3
MD4   DEC -4
MD5   DEC -5
MD7   DEC -7
MD10  DEC -10 
MD11  DEC -11 
MD13  DEC -13 
MD19  DEC -19 
MD40  DEC -40 
MD44  DEC -44 
MD47  DEC -47 
MD48  DEC -48 
MD51  DEC -51 
MD52  DEC -52 
MD53  DEC -53 
MD103 DEC -103
MD150 DEC -150
AS.00 ASC 1,00
AS.01 ASC 1,01
AS.02 ASC 1,02
AS.03 ASC 1,03
AS.IO ASC 1,IO
AS.SC ASC 1,SC
AS.DS ASC 1,DS
AS.R  ASC 1,R 
AS.RQ ASC 1,RQ
BLANK ASC 1,
CRLF  OCT 6412
ABMSG DEF ABORT 
ABORT ASC 4, ABORTED
SUMSG DEF SUSP
SUSP  ASC 4, SUSPEND
* 
SIZE  EQU * 
* 
      END 
                                                                                                                                                                                                  