ASMB,L,C,Q   ** REIO ** 
*     NAME:   REIO
*     SOURCE: 92067-18275 
*     RELOC:  PART OF 92067-16268 AND 92067-16035 
*     PGMR:   G.A.A.,C.M.M.,G.L.M.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  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 REIO,7 92067-1X275 REV.2013 790316
      EXT .DFER,$LIBR,$LIBX,EXEC,.ENTR
      ENT REIO
      SUP 
      SPC 1 
*     THIS ROUTINE DOES REENTRENT I/O IF THE USERS BUFFER 
*     IS 37 OR MORE WORDS ABOVE THE PROG LOAD POINT.
*     THIS RESTRICTION IS ENFORCED BECAUSE THE USERS BUFFER 
*     IS USED AS A TDB FOR THE REENTRANT PROCESSOR AND THUS 
*     THREE WORDS(PLUS 2 FOR SAVE X AND Y REG WORDS AND 32 FOR
*     THE USER MAP SAVE AREA) ARE REQUIRED ABOVE IT.
* 
* NOTE: FOR MEMORY RESIDENT PROGRAMS, THE BUFFER MUST BE 5
*       OR MORE WORDS ABOVE THE PROGRAM LOAD POINT. 
* 
* 
*     THESE THREE WORDS ARE SAVED LOCALLY AND THE TDB IS SET UP.
*     AFTER THE I/O HAS COMPLETED THE WORDS ARE RESTORED. 
* 
*     IF THE BUFFER IS TOO CLOSE TO THE LOAD POINT THE I/O IS 
*     PERFORMED IN THE STANDARD MANNER.  THIS IS ALSO TRUE IF THE 
*     BUFFER IS MORE THAN 129 WORDS LONG (TO CONSERVE SYSTEM MEMORY). 
* 
*     CALLING SEQUENCE: 
* 
*     THE SAME AS THE EXEC I/O CALL WITH OUT THE TRACK/SECTOR WORDS.
* 
RQ    BSS 4         PRAMETER ADDRESS AREA 
REIO  NOP           ENTRY POINT 
      JSB .ENTR     FETCH THE PRAMETERS 
      DEF RQ
      LDA RQ+3,I    PULL PRAMETERS IN LOCALLY 
      STA RQ+3      INCASE THEY ARE 
      LDA RQ,I      ARE IN THE THREE WORD 
      STA RQ        AREA AHEAD OF 
      LDA RQ+1,I    THE BUFFER
      STA RQ+1
* 
      LDA XEQT      GET THE PROGRAM LOAD
      ADA D22       POINT 
      XLA A,I 
      LDB RQ+2      AND THE BUFFER ADDRESS
      CMB,INB       NOW MAKE SURE THAT THE BUFFER 
      ADB A         IS ABOVE THE LOAD POINT OF
      CLE,SSB,RSS      PROGRAM. 
      JMP DIRIO     BUFFER BELOW PROG MUST BE IN COMMON 
      ADB D4        BUFFER ABOVE LOAD POINT, BUT IS IT
      CLE,SSB,RSS       WITHIN 5 WORDS ?
      JMP DIRIO     YES, SO FORGET IT 
* 
      LDA XMATA     FETCH ADDRESS OF CURRENT MAT ENTRY
      SZA,RSS       IF THIS IS A MEMORY RESIDENT
       JMP OK         PROGRAM IT'S OK TO DO REIO. 
* 
      ADB D32       DISC RESIDENT, CHECK FOR MAP SAVE AREA
      CLE,SSB,RSS    BUFFER MUST BE 37 WORDS ABOVE LOAD POINT.
      JMP DIRIO     TOO BAD, THE BUFFER IS TOO CLOSE
* 
* 
OK    LDA RQ+2       GET THE BUFFER ADDRESS 
      ADA N3         LESS THREE & SET 
      STA TDBA       UP THE $LIBR & 
      STA TDBA2                      $LIBX CALLS. 
* 
      JSB .DFER     ELSE SAVE THE THREE WORDS 
      DEF S1        IN LOCAL SAVE AREA
      DEF TDBA,I
      LDB RQ+3      GET THE REQUEST LENGTH
      SSB,RSS       IF POSITIVE SKIP CONVERSION 
      JMP RE1 
* 
      BRS           CONVERT CHARACTERS TO 
      CMB,INB       WORDS AND SET POSITIVE
RE1   ADB D3        ADD THREE WORDS FOR TDB LENGTH
      STB A         AND PUT IN A FOR LENGTH TEST
      ADA N133      SUBTRACT 133 (129 + 3 + 1)
      CLE,SSA,RSS   IF POSITIVE OF ZERO 
      JMP DIRIO     DO IT DIRECT
* 
      CLA,CCE       SET ZERO IN WORD ONE AND
      DST TDBA,I    LENGTH IN WORD TWO OF THE TDB 
      JSB DOIO      GO DO THE I/O 
S1    OCT 0,0,0     RETURN SKIPS THREE WORDS
      DST RQ        SAVE THE REGISTERS
      JSB .DFER     RESTORE THE THREE WORDS 
      DEF TDBA,I
      DEF S1
      DLD RQ        RESTORE THE A AND B REGS. 
      JMP REIO,I    AND EXIT TO USER. 
* 
DOIO  NOP 
      JSB $LIBR     TELL THE SYSTEM WE ARE
TDBA  DEF *         RENT
DIRIO JSB EXEC      DO THE I/O CALL 
      DEF EX        RETURN ADDRESS
      DEF RQ
      DEF RQ+1
      DEF RQ+2,I
      DEF RQ+3
EX    RSS           SKIP IF ERROR EXIT
      ISZ REIO      ELSE STEP RETURN ADDRESS
      SEZ,RSS       IF DIRECT 
      JMP REIO,I    EXIT
* 
      JSB $LIBX     ELSE EXIT RENT
TDBA2 DEF *         SECTION 
D3    DEC 3         +3 WORDS
* 
D32   DEC 32
N133  DEC -133
N3    DEC -3
N2    DEC -2
D22   DEC 22
D4    DEC 4 
XMATA EQU 1646B 
XEQT  EQU 1717B 
A     EQU 0 
      ORG * 
      END 
                                                                            