ASMB,R,L,C
      HED RTE AND DOS TAPE POSITIONING ROUTINE
* 
*     NAME:   PTAPE 
*     SOURCE: 92068-18024 
*     RELOC:  PART OF 92067-16268 AND 92067-16035 
*     PGMR:   R.A.G.
* 
*  ***************************************************************
*  * (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.       *
*  ***************************************************************
* 
      NAM PTAPE,7 92068-1X024 REV.2013 750701 
      ENT PTAPE 
      EXT EXEC,.ENTR
      SPC 2 
*     CALLING SEQUENCE
*         CALL PTAPE(UNIT, #FILES, #RECORDS)
* 
*         UNIT ------ EQT ORDINAL FOR EXEC CALL 
*         #FILES ---- > 0 FOR FORWARD 
*                     < 0 FOR REVERSE 
*         #RECORDS -- > 0 FOR FORWARD 
*                     < 0 FOR REVERSE 
*                     (A FILE MARK ENCOUNTERED DURING RECORD
*                         SPACING COUNTS AS ONE RECORD) 
* 
*     A BACKSPACE FILE LEAVES THE TAPE AT THE BEGINNING OF THE FILE.
*     AN END-OF-TAPE CONDITION CAUSES IMMEDIATE RETURN TO THE USER. 
      SPC 2 
UNIT  NOP           ADDRESS OF LOGICAL UNIT NUMBER
FILES DEF ZERO      ADDRESS OF FILE COUNT 
RECS  DEF ZERO      ADDRESS OF RECORD COUNT 
      SPC 1 
PTAPE NOP           ENTRY POINT 
      JSB .ENTR     TRANSFER
      DEF UNIT               PARAMETERS 
      LDA UNIT,I    GET EQT ORDINAL (UNIT NUMBER) 
      SZA           IF ZERO 
      SSA                   OR NEGATIVE:
      JMP EXIT      UNIT NUMBER IN ERROR: RETURN
      AND B77       ISOLATE UNIT NUMBER 
      IOR B200      CONFIGURE BACKSPACE CONTROL WORD
      STA BSR            AND STORE IT 
      IOR B100      CONFIGURE FORWARD SPACE CONTROL 
*                                       WORD
      STA FSR            AND STORE IT 
      XOR B500      CONFIGURE DYNAMIC STATUS REQUEST
*                                       CONTROL WORD
      STA DSTAT          AND STORE IT 
      LDA RECS,I    GET NUMBER OF RECORDS 
      STA RECS           AND SAVE IT
      LDB FILES,I   GET NUMBER OF FILES 
      JSB ABS       GO SET UP FOR FILE SPACING
      JMP RCRD      RETURNS HERE IF NO FILES: 
*                                       GO DO RECORDS 
      JSB SPACE     GO SPACE A RECORD 
      JMP *-1       FILE MARK NOT FOUND: DO ANOTHER 
      ISZ COUNT     FILE MARK FOUND: ENOUGH SPACED? 
      JMP *-3       NO: REPEAT
      LDA FILES,I   GET ORIGINAL FILE COUNT AGAIN 
      SSA           HAVE WE BEEN BACKSPACING? 
      ISZ RECS      YES: ADD 1 TO THE RECORD COUNT
      RSS           IF NOT ZERO, GO SPACE RECORDS 
      JMP EXIT      ELSE GO RETURN TO USER
RCRD  LDB RECS      GET NUMBER OF RECORDS 
      JSB ABS       GO SET UP FOR RECORD SPACING
      JMP EXIT      NO RECORDS: RETURN TO USER
      JSB SPACE     GO SPACE A RECORD OR
*                                       TO FILE MARK
      NOP           FILE MARK NOT FOUND 
      ISZ COUNT     ENOUGH RECORDS SPACED?
      JMP *-3       NO: GO SPACE ANOTHER
EXIT  LDA ZERO      CLEAR FILE
      STA FILES             AND RECORD
      STA RECS                      ADDRESS WORDS 
      JMP PTAPE,I   RETURN TO USER
      SPC 1 
SPACE NOP           ENTRY POINT TO
*                                          TAPE MOTION SECTION
      JSB EXEC      GO GET DYNAMIC STATUS 
      DEF *+3       RETURN ADDRESS
      DEF RCODE     ADDRESS OF I/O CONTROL
*                                       REQUEST CODE
      DEF DSTAT     ADDRESS OF DYNAMIC STATUS 
*                                       CONTROL WORD
      AND B40       ISOLATE EOT BIT 
      SZA           END OF TAPE?
      JMP EXIT      YES: RETURN IMMEDIATELY TO USER 
      JSB EXEC      NO: SPACE THE TAPE
      DEF *+3       RETURN ADDRESS
      DEF RCODE     ADDRESS OF I/O CONTROL
*                                       REQUEST CODE
      DEF FUNCT     ADDRESS OF FUNCTION CONTROL WORD
      JSB EXEC      GET DYNAMIC STATUS AGAIN
      DEF *+3       RETURN
      DEF RCODE     REQUEST CODE
      DEF DSTAT     CONTROL WORD
      RAL           SHIFT SOT BIT 
      ALF,ALF                     TO POSITION 15
      SSA           START OF TAPE?
      JMP EXIT      YES: RETURN TO USER 
      SLA           NO: END OF FILE MARK FOUND? 
      ISZ SPACE     YES: INCREMENT RETURN ADDRESS 
*                                       BY 1 BEFORE RETURNING 
      JMP SPACE,I   RETURN
      SPC 1 
ABS   NOP           ENTRY TO SPACE SET UP ROUTINE 
      LDA FSR       GET FORWARD SPACE CONTROL WORD
      SSB           IS COUNT NEGATIVE?
      LDA BSR       YES: GET BACKSPACE CONTROL WORD 
      STA FUNCT     STORE CONTROL WORD
*                                        AT CORRECT ADDRESS 
      SSB,RSS       IS COUNT POSITIVE?
      CMB,INB       YES: TAKE 2'S COMPLIMENT
      STB COUNT     STORE NEGATIVE COUNT
      SZB           IS COUNT ZERO?
      ISZ ABS       NO: INCREMENT RETURN ADDRESS
      JMP ABS,I     RETURN
      SPC 1 
ZERO  NOP           ZERO WORD 
FSR   OCT 000300    FORWARD SPACE CONTROL WORD
BSR   OCT 000200    BACKSPACE CONTROL WORD
RCODE DEC 3         I/O CONTROL REQUEST CODE
DSTAT OCT 000600    DYNAMIC STATUS CONTROL WORD 
FUNCT NOP           DEFINED ADDRESS OF CONTROL WORD 
COUNT EQU UNIT      'UNIT' DOUBLES AS RECORD COUNT
B77   OCT 77        UNIT NUMBER MASK
B40   OCT 40        EOT BIT MASK
B100  OCT 100       FORWARD SPACE CONWD COMPONENT 
B200  OCT 200       BACKSPACE CONWD COMPONENT 
B500  OCT 500       STATUS CONWD COMPONENT
      END 
* 
* 
                                                                                                                                                      