         SYSTEM   SIG7
         SYSTEM   BPM
         DEF      INIT,PFLAG
         REF      DATA,F:PAGE,VERSION
CPV      SET      1
         SPACE    2
INIT     STW,0    TCB
*                                     MEANING WE CAN DO LDEVS
         MTW,0    PFLAG
         BGZ      $+3               WE'RE PAGING; CONTINUE
         AI,15    1                 GET RETURN ADDR
         B        *15               RETURN WITH NO CHANGE
*
         M:GP     1                 GET LOWEST DYN PAGE
         BCS,8    NONE              NO PAGE AVAIL; ABORT
         MTW,1    NPAGES            COUNT PAGES
         STW,9    PAGE              CLEANUP WLLILL CALEAN PAGE
         STW,9    PAGE0             BASE OF REL PAGING
         AI,9     -DATA+8           GET OFFSET FROM DATA
         SLS,9    -2                GET INDEX VALUE
         LW,1     *15               GET ADDR OF FREE
         STW,9    *1                FAKE IT OUT
         AI,15    +1                GET PROPER RETURN ADDR
         STW,9    FORTRAP           SAVE FORT TRAP HAN ADDR
         STD,8    PTC
         LI,3     0
         STW,3    RPAGE             FOR CLEANUP
         B        CLEANUP           CLEANUP RETURNS TO FORT
*
*
         DEF      LDEV
         REF      NCOPIES
LDEV     EQU      $
BPMOK    SET      0                 BUG IN A00 LDEV PROC (*COPIES)
         DO       BPMOK
         M:LDEV   'L2',(DEV,'LP'),(COPIES,*NCOPIES)
         B        *15
         ELSE
         CAL1,8   $+2               M:LDEV
         B        *15
         DATA     X'1A'**24
         DATA     X'C08'**20
         DATA     X'D3F2'
         DATA     X'D3D7'
         PZE      *NCOPIES          THIS FIXES BUG....
         PAGE
*
* TRAP GETS CONTROL ON TRAP.
*  FIRST CHECKS FOR NAO; IF NOT, LET FORT HANDLE IT
*  THEN MAKES SURE NAO IS IN PAGING RANGE; IF NOT, USE FORT
*
* THEN HALF WORD TABLE PTAB IS USED TO KEEP TRACK
*  OF EACH VIRTUAL PAGE:
*        -1 -> NOT GOTTEN YET
*         0 -> GOTTEN AND IN CORE
*         1 -> GOTTEN BUT SWAPPED OUT AND RELEASED
*
* IF  NOT GOTTEN, TRY TO GET IT; IF REFUSED,
*  ASSUME THAT OUT OF PAGES.  SWAP ONE OUT AND USE
*  THIS PAGE (M:GVP)
*
*  IF PAGE IS IN CORE, WE HAVE AN ERROR
*
* IF PAGE IS OUT OF CORE, SWAP ONE OUT AND GET THIS
*   ONE IN.
*
* SWAP OUT DECISION:
*  THUS, WE NEVER SWAP OUT IMMEDIATLY PRECDING PAGE
*   SO, IF REL PAE NO IS 0 OR 1, WE CHOOSE HIGH PAGE
*    OTHERWISE, WE CHOOSE LOWEST PAGE POSSIBLE
*    BECAUSE PAGE IS PASSED AND WON'T BE USED FOR A WHILE
*
*
TRAP     STCF     CCODES            SAVE CC'S
         LCI      0
         STM,0    REGS              SAVE REGS FOR FORTRAN
         LW,3     18,1              GET TRAP #
         CI,3     X'40'             NAO ??
         BNE      FORT              NO, GO TO FORTRAN TRAP HAND
         LW,3     *1                GET INST ADDR
         STW,3    PSDADR            SAVE ADR OF PSD
         LCI      0
         LM,0     2,1               RESTORE REGS FROM TRAP TIME
         ANLZ,3   *PSDADR           GET ADDRESS OF TRAPPED MEM
         AND,3    =X'1FE00'         GET PAGE ADDR
         CW,3     PAGE0             IS IT A PAGED PAGE??
         BL       FORT              NOPE; TAKE IT FORTRAN !!
*
*  OUR TRAP
         STW,3    PAGE              SAVE ADDR OF TRAPPED PAGE
         SW,3     PAGE0             SAVE REL PAGE ADDR
         SLS,3    -9                CONVERT TO STEP 1
         STW,3    RPAGE
         MTH,0    PTAB,3            WHAT IS STATUS OF PAGE??
         BEZ      BADTRAP           SHOULDN'T AVE TRAPPED
         BGZ      SWAP              PAGE OUT OF CORE, GET IT
*
*  PAGE IS NOT GOTTEN YET; TRY TO GET IT
*
         BAL,15   GETPAGE           GET, INIT AND MARK PAGE IN PTAB
         B        SWAP              NOPE; SWAP ONE
         MTW,1    NPAGES            COUNT PAGES ACQUIRED
         M:TRTN                     RETURN TO TRAPPED PROGRAM
         PAGE
SWAP     MTW,1    NSWAPS            COUNT # OF PAGING OPERS.
         LI,2     0                 ASSUME SWAPPNG LOW PAGE
         LW,1     RPAGE               R2 => OPERATION; 0=> LOOK UP, 1=> L OK DOW
         CI,1     2                 ARE WE??
         BGE      $+2               YES
         LI,2     1                 NO; SWAP HIGH PAGE
*
         STW,3    TABLE             BIR/BDR STARTING ADR
         LW,1     INITVAL,2         GET INIT FOR R2
*
SLOOP    MTH,0    *TABLE,1          HOW 'BOUT THIS PAGE
         BEZ      GOTONE            YUP; N CORE ABOUT TO BE SWAPPED
         EXU      BUMP,2            NO, TRY NEXT PAGE
         MTH,0    PTAB              MUST CHECK HERE TOO..
         BEZ      GOTONE            FOUND IT AT LAST
         B        BADLOGIC          ERROR; NO SWAPPABLE PAGES IN PTAB
GOTONE   AI,1     0                 IF GOING UP, R1 100 TO SMALL
         BGZ      $+2
         AI,1     100               CORRECT PROBLEM
         STW,1    FRPAGE            SET RELATIVE PAGE TO BE FREED
         SLS,1    +9                STEP BY PAGE ADDRESS
         AW,1     PAGE0             CALC. VIRTUAL ADDR
         STW,1    FPAGE             SAVE IT
         BAL,15   FREEPAGE          WRITE OUT, FREE AND MARK IN PTAB
         BAL,15   GETPAGE           GET, READ OR INT, & MARK PAGE
         B        CANTGET           WHY CAN'T WE GET THIS PAGE??
         M:TRTN                     RETURN TO TRAPPED PROGRAM
         PAGE
*
*
GETPAGE  M:GVP    *PAGE             GET THE PAGE
         BCS,8    *15               NO, TAKE ERROR ADDR
         AI,15    1                 SET PROPER RETURN
         LW,3     RPAGE
         MTH,0    PTAB,3            STATUS OF OUR NEW PAGE
         BLZ      CLEANUP           NEW PAGE, CLEAN IT
         BGZ      INSWAP            SWAP PAGE IN
         B        UNKPAGE           WHAT'S THE MATTER NOW??
*
INSWAP   LW,3     BYTE0             GET BTE 0 OF KEY/BLOCK
         STB,3    RPAGE             RPAGE IS KEY
         CAL1,1   *READFPT          READ IN THE PAGE
         LW,3     RPAGE             GET REL PAGE
         MTH,-1   PTAB,3            THIS PAGE NOW IN CORE
         B        *15               RETURN
*
CLEANUP  LI,3     0
         LI,6     511
         STW,3    *PAGE,6           CLEAR THE PAGE
         BDR,6    $-1
         LW,3     RPAGE
         MTH,1    PTAB,3            MARK HTIS PAGE AS IN CORE
         B        *15               RETURN
         SPACE    5
FREEPAGE LW,3     FRPAGE
         MTH,0    PTAB,3            CHECK ONCE MORE
         BNE      BADFREE           FREEING PAGE NOT N CORE
         MTW,0    DCBOPEN           MUST WE OPEN T FIRST
         BGZ      $+2               NO
         BAL,14   OPENDCB           YES
         LW,3     BYTE0             GET BYTE 0 OF FRPAGE
         STB,3    FRPAGE            SET IT (TEXTC IF NEC)
         CAL1,1   *WRITEFPT         SAVE THE PAGE
         M:FVP    *FPAGE            FREE THE PAGE...
         BCS,8    NOTFREED          WHAT'S THE PROBLEM??
         LW,3     FRPAGE            MARK FREED PAGE
         MTH,1    PTAB,3            AS SUCH IN PTAB (MAP)
         B        *15               RETURN
         SPACE    3
OPENDCB  M:OPEN   F:PAGE,(FILE,'GPG'),(ERR,RANDFAIL),(ABN,RANDFAIL),;
                  (DIRECT),(OUTIN),(REL),(RSTORE,100),(RANDOM)
         MTW,+1   DCBOPEN           YUP..  NOTE IT
         B        *14                RETURN
RANDFAIL M:OPEN   F:PAGE,(FILE,'GPG'),(ERR,NOPEN),(ABN,NOPEN),(KEYED),;
                  (DIRECT),(OUTIN),(REL),(KEYM,4)
         LW,3     WKEY
         STW,3    WRITEFPT          USE KEYED FPT'S
         LW,3     RKEY
         STW,3    READFPT
         LI,3     3                 BYTE 0 FOR TEXTC KEYS
         STW,3    BYTE0
         B        *14
FORT     LCI      0
         LM,0     REGS              RESTORE POST-TRAP REGS
         LCF      CCODES            RESTORE TRAP CC'S
         B        *FORTRAP          RETURN TO FORTRAN
         SPACE    5
*
*    ERRORS
*
BADTRAP  LI,7     WHYTRAP
         B        TYPE
NONE     LI,7     NOPAGES           'NO PAGE 1ST TRY'
         B        TYPE
BADLOGIC LI,7     NONE0             'NO PAGES IN CORE TO SWAP'
         B        TYPE
NOTFREED LI,7     BADFP             'M:FVP FAILED'
CANTGET  LI,7     BADPAGE           'CAN'T GT THIS AGE'
         B        TYPE
UNKPAGE  LI,7     2PAGE             'TRYING TO GET SAME PAGE 2X'
         B        TYPE
BADFREE  LI,7     BADFM             'FREEING PAGE WITH <> ST'
         B        TYPE
NOPEN    LI,7     NEITHER           'CANT OPEN EITHER FILE'
         B        TYPE
WERR     LI,7     BADWRITE          'WRTE EROR'
         B        TYPE
RERR     LI,7     BADREAD           'READ ERROR'
         B        TYPE
TYPE     M:TYPE   (MESS,PERMSG)
         M:TYPE   (MESS,*7)
         M:XXX
         PAGE
* DATA
*
BYTE0    DATA     0
NPAGES   DATA     0
NSWAPS   DATA     0
INITVAL  DATA     -100,100
BUMP     BIR,1    SLOOP
         BDR,1    SLOOP
TABEND   DATA     PTABEND,PTAB
PAGE     RES      1                   ADDRESS OF PAGE ACCESSED TO CAUSE TRAP
RPAGE    RES      1                   REL PAGE # OF TRAPPED ADDRESS
FPAGE    RES      1                   PAGE ADDR TO BE FREED IN PAGINS SCHEME
FRPAGE   RES      1                   REL PAGE # TO BE FREED
PAGE0    RES      1                   ADDRESS OF 1ST PAGE
TCB      RES      1
PSDADR   RES      1                 SAVE ADDR OF PSD AT TRAP TIME
DCBOPEN  DATA     0
WRITEFPT DATA     WRAN
READFPT  DATA     RRAN              ASSUME RANDOM FILES
CCODES   RES      1                 STORAGE FOR CC'S
REGS     RES      16
         BOUND    8
PTC      DATA     0,0
FORTRAP  DATA     0
*
*
PTAB     EQU      $
         LIST     0
         DATA     -1
         FIN
         LIST     1
PTABEND  DATA     -1
         PAGE
*        FILE FPTS
*
WKEY     GEN,8,24 X'11',F:PAGE
         DATA     X'F8000050'
         DATA     WERR,WERR
         PZE      *FPAGE            BUFFER ADDR
         DATA     512*4             LENGHT
         PZE      *FRPAGE           KEY ADDR
*
WRAN     GEN,8,24 X'11',F:PAGE
         DATA     X'F1000010'
         DATA     WERR,WERR
         PZE      *FPAGE              BUFFER ADDR
         DATA     512*4             LENGTH
         PZE      *FRPAGE           BLOCK #
*
RKEY     GEN,8,24 X'10',F:PAGE
         DATA     RERR,RERR
         PZE      *PAGE             BUFFER ADDR
         DATA     512*4             BUFFER LEN
         DATA     RPAGE             KEY ADDR
*
RRAN     GEN,8,24 X'10',F:PAGE
         DATA     X'F1000010'
         DATA     RERR,RERR
         PZE      *PAGE             BUFFER ADDR
         DATA     512*4             BUFFER LEN
         PZE      *RPAGE
*
PFLAG    DATA     1
         PAGE
* TEXTC STUFF
*
WHYTRAP  TEXTC    'TRAP ON PAGE WITH 0 STATUS!!'
NOPAGES  TEXTC    'CAN''T GET 1ST PAGE'
NONE0    TEXTC    'NO 0 VALUES IN PTAB TO SWAP'
BADPAGE  TEXTC    'CAN''T GET PAGE AFTER REL 1'
PERMSG   TEXTC    'PAGING ERROR'
BADFP    TEXTC    'M:FVP FAILED'
BADFM    TEXTC    'FREEING PAGE W/ NON 0 STATUS'
NEITHER  TEXTC    'CAN''T OPEN EITHER RAN OR KEYED DCB'
BADWRITE TEXTC    'WRITE ERR'
BADREAD  TEXTC    'READ ERR'
F:1    DSECT   1
F:1    M:DCB   (FILE),(IN),(SEQUEN),(SAVE)
F:2      DSECT    1
F:2      M:DCB    (FILE),(IN),(SEQUEN),(SAVE),(DEVICE,'NO')
         ORG,1    BA(F:2)+3
         DATA,1   3                 SET TO NO DEVICE
         ORG      F:2+1
         DATA     X'28000'          DEFAULT F:2 TO NO
F:3    DSECT   1
F:3    M:DCB   (FILE,'TEMP1'),(CONSEC),(SEQUEN),(OUTIN),;
               (REL)
F:4    DSECT   1
F:4    M:DCB   (DEVICE,'LP'),(CONSEC),(SEQUEN),(OUT),;
               (REL),(VFC)
F:5    DSECT   1
F:5    M:DCB   (FILE,'TEMP2'),(CONSEC),(SEQUEN),(OUTIN),;
               (REL)
F:6    DSECT   1
         DO       CPV=0
F:6    M:DCB   (FILE,'TEMP3'),(CONSEC),(SEQUEN),(OUTIN),;
               (REL)
         ELSE
F:6      M:DCB    (DEVICE,'L2'),(VFC)
         FIN
       END
