ASMB,R,L,C   ** MMAP ** 
      HED MMAP ROUTINE TO MAP EMA PAGES IN MSEG 
*     SOURCE: 92067-18059 
*     RELOC:  PART OF 92067-16035 
*     PGMR:   S.P.K.
* 
*  ***************************************************************
*  * (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 MMAP,7 92067-16035 REV.1805 771020
      SUP 
      ENT MMAP,..MP,.MMAP,.EMSZ,.MSG#,.MSGS,.NPGS,.IPGS 
      EXT $DVPT,$LIBR,$LIBX 
* 
* 
*  ROUTINE TO MAP THE REQUESTED SEQUENCE OF PHYSICAL
*  PAGES IN THE MAPPING SEGMENT ADDRESS SPACE 
*  IF THE # OF PAGES SPECIFIED TO BE MAPPED IS LESS 
*  THAN THE STANDARD MAPPING SEGMENT SIZE, MMAP WILL MAP
*  UPTO THE STANDARD MSEG SIZE PAGES IF THEY FIT
* 
*  CALLING SEQUENCE:  JSB MMAP
*                     DEF RTN      RETURN ADDRESS 
*                     DEF IPGS     # OF PAGES DISP FROM START OF EMA
*                                  UPTO THE FIRST PAGE TO MAP 
*                     DEF NPGS     # OF PAGES TO BE MAPPED
* 
*  RETURNS:  A REG = 0  IF NORMAL RETURN
*                  = -1 IF ERROR RETURN 
* 
* 
*  MMAP HAS TWO OTHER ENTRY POINTS .MAP. AND .MMAP
*  .MAP. IS ENTERED BY .EMIO WHILE DOING SPECIAL MAPPING
*  CALLING SEQUENCE FOR .MAP. IS:  JSB .MAP.
* 
*  .MMAP IS ENTERED BY .EMAS WHILE MAPPING A STANDARD MSEG
*  CALLING SEQUENCE FOR .MMAP IS:  JSB .MMAP
* 
* 
* 
MMAP  NOP 
      LDA MMAP,I    GET THE RETURN ADDRESS
      STA RETRN     AND SAVE IT 
      ISZ MMAP      GET THE NEXT PARAMETER
      LDA MMAP,I
      LDA A,I       A REG HAS # OF PAGES DISPLACEMENT FROM START
      STA .IPGS     OF EMA TO START OF SEGMENT TO BE MAPPED 
      SSA           -VE?
      JMP ERROR     YES, THEN ERROR 
      ISZ MMAP
      LDB MMAP,I    GET THE NEXT PARM 
      LDB B,I       # OF PAGES TO BE MAPPED 
      SSB           -VE?
      JMP ERROR     YES, THEN ERROR 
      STB .NPGS 
      LDA XIDEX     ADDRESS OF ID SEG EXT 
      SZA,RSS       IS IT 0?
      JMP ERROR     YES THEN NOT AN EMA PROG
      LDA XEQT      GET ID SEG ADDRESS
      ADA .28 
      XLA A,I       GET WORD 28 OF THE ID SEGMENT 
      AND B1777     MASK OUT THE EMA SIZE 
      STA .EMSZ     SAVE IT 
      XLA XIDEX,I   GET FIRST WORD OF ID SEG EXT
      AND B37       MASK STANDARD MSEG SIZE 
      STA .MSGS     SAVE IT 
* 
      LDA .IPGS     FIND MSEG # IF STANDARD MSEG
      CLB 
      DIV .MSGS     RELATIVE START PAGE OF MSEG/.MSGS 
      SZB           REMAINDER=0?
      CCA           NO, NON-STANDARD MSEG 
      STA .MSG#     SAVE MAPPING SEGMENT #
      JMP .MAP1     SKIP OVER FOLLOWING ENTRY POINT 
* 
..MP  NOP           ENTRY POINT FOR .EMIO TO ENTER
      LDA ..MP      GET RETURN ADDRESS
      STA RETRN     SET UP MAIN RETURN ADDRESS
.MAP1 LDA .NPGS     # OF PAGES TO BE MAPPED 
      ADA .IPGS     # OF PAGES DISP FROM START OF EMA 
      CMA,INA 
      ADA .EMSZ     EMA SIZE-(#PGS DISP+#PGS TO BE MAPPED)
      SSA           EMA SIZE < NPGS+.IPGS?
      JMP ERROR     YES, THEN ERROR 
      LDB .NPGS     # OF PAGES TO BE MAPPED 
      CMB,INB 
      ADB .MSGS     MSGSZ - NPGS
      SSB           .NPGS> MSGSZ? 
      JMP ERROR     YES, ERROR
      ISZ .MSGS     INCREMENT MSEG SIZE TO ACCOUNT
      LDB .MSGS          FOR OVERFLOW PAGE
      LDA .EMSZ     EMA SIZE
      CMA,INA 
      ADA .IPGS     #PGS DISP FROM START EMA - EMA SIZE 
      ADB A           + MSEG SIZE + 1 
      CMA,INA       EMA SIZE - # PGS DISP 
      SSB           .IPGS+.MSGS+1<=EMA SIZE?
      LDA .MSGS     YES, #PAGES TO MAP IS MSEG SIZE + 1 
      STA .NPGS     SET # OF PAGES TO BE MAPPED 
      SZA,RSS       0?
      JMP ERROR     YES, THEN IPGS = EMASZ
      JMP NOADJ     SKIP OVER FOLLOWING ENTRY POINT 
* 
*   CHANGE USER MAP ON BASE PAGE
* 
.MMAP NOP 
      LDA .MMAP     SET UP MAIN RETURN ADDRESS
      STA RETRN 
      ISZ .MSGS     ACCOUNT FOR OVERFLOW PAGE 
NOADJ JSB $LIBR     TURN OFF INTERRUPTS AND 
      NOP           MEMORY PROTECT FENCE
      LDA XIDEX 
      INA 
      XLA A,I       GET 2ND WORD OF ID SEG EXT
      CAY           SAVE IT 
      AND B1777     MASK PHYSICAL START PAGE OF EMA 
      ADA .IPGS     A REG = PHYSICAL START PAGE OF MAPPING SEG
      STA .IPGS     SAVE IT 
      LDA B40       READ THE USER BASE PAGE # FROM DMS REG 40B
      CCB 
      CBX           -1 IN XREG TO READ 1 REG
      LDB AEMSZ     ADDRESS OF LOC CONTAINING MEM ADDRESS 
      XMM           READ DMS REG
      CLB,INB       X REG = 1 TO CHANGE CONTENTS OF 1 DMS REG 
      CBX           B TO X
      XLA $DVPT     DMS REG# POINTING TO START OF DRIVER PARTN
      STA MLOC
      ADA B40 
      LDB AEMSZ     POINT THIS REG TO USER BASE PAGE
      XMM 
      LDB MLOC      START PAGE OF DRIVER PARTN
      BLF,BLF       MULTIPLY BY 2000B 
      RBL,RBL 
      ADB B1740     LOC ON USER BASE PAGE AT WHICH MSEG STARTS
      CYA           SECOND WORD ID SEG EXT FROM Y TO A
      ALF,RAL       MOVE BITS 11-15 TO POSITION 10-14 
      AND B37       MASK OUT START LOGICAL PAGE OF MSEG 
      STA MSTRT     SAVE IT 
      ADB A         BREG HAS MEM LOC ON BASE PAGE 
      STB MLOC      AT WHICH USER MAP MUST BE CHANGED 
      LDA .NPGS     # OF PAGES
      CMA,INA            COUNTER
      STA .EMSZ 
      LDA .IPGS     START PHYSICAL PAGE OF MSEG 
LOOP  STA B,I       STORE IT ON USER BASE PAGE
      INA           INCREMENT PAGE #
      INB           POINT TO NEXT LOC 
      ISZ .EMSZ     INCREMENT COUNTER 
      JMP LOOP      STORE NEXT PAGE#
*   USER MAP ON BASE PAGE IS CHANGED TO SHOW THE NEW MSEG 
*   REST OF THE LOCATIONS MUST BE MADE READ&WRITE PROTECTED 
* 
      LDA .MSGS     FIND # OF LOCATIONS LEFT TO BE
      CMA,INA       READ AND WRITE PROTECTED
      ADA .NPGS     #PAGES - (MSEG SIZE+1)
      SZA,RSS       EQUAL?
      JMP STDMS     YES THEN SET DMS REGISTERS
      STA .EMSZ     #PGS TO READ-WRITE PROTECT
      LDA B140K 
LOOP1 STA B,I       STORE 140000B IN LOC ON USER BASE PAGE
      INB           POINT TO NEXT LOC 
      ISZ .EMSZ     INCREMENT COUNTER 
      JMP LOOP1 
* 
STDMS LDA B40       40 OCTAL
      ADA MSTRT     FIRST MAP REGISTER TO BE CHANGED IN A REG 
      LDB .MSGS     #DMS REG TO CHANGE IS MSEG SIZE + 1 
      CBX           TO BE LOADED FROM 
      LDB MLOC      USER BASE PAGE
      XMM           TRANSFER MEM INTO DMS REG 
* 
      XLA XIDEX,I   GET FIRST WORD OF ID SEG EXT
      LDB .MSG# 
      SSB,RSS       -1? 
      JMP MMAP1     NO
      IOR BIT15     YES, THEN SET BIT 15
      JMP MMAP2 
* 
MMAP1 AND B37       MASK OUT BITS 0-4 
      BLF,RBL       MOVE MSEG # TO BITS 5-14
      ADA B 
MMAP2 XSA XIDEX,I   STORE BACK WORD 0 OF THE ID SEG EXT 
      CLA           RETURN WITH A REG=0 
      JSB $LIBX     TURN ON MEMORY PROTECT & INTERRUPTS 
      DEF RETRN 
* 
ERROR CCA           ERROR RETURN WITH A REG=-1
      JMP RETRN,I 
* 
* 
RETRN NOP 
.IPGS NOP 
.NPGS NOP 
.MSGS NOP 
.MSG# NOP 
.EMSZ NOP 
AEMSZ DEF .EMSZ 
MSTRT NOP 
MLOC  NOP 
B37   OCT 37
B40   OCT 40
B1777 OCT 1777
B1740 OCT 1740
B140K OCT 140000
BIT15 OCT 100000
.28   DEC 28
N1    DEC -1
A     EQU 0 
B     EQU 1 
XIDEX EQU 1645B 
XEQT  EQU 1717B 
      END 
                                                                                                                                                      